[英]Java Servlets: How to repeat an HTTP request?
如果發生數據庫死鎖,我想自動重復HTTP請求; 但是, FilterChain.doFilter()被定義為單向鏈(因此我無法重置其狀態)。
在安全的情況下, 是否可以重復HTTP請求而無需客戶端重新提交請求 ?
更新 :我剛剛發現這種方法有問題。 即使重復請求,也需要緩沖請求InputStream 。 這意味着,如果用戶上載100MB的數據,則無論是否發生死鎖,您都將被迫緩沖該數據。
我正在探索讓客戶端在此處重復請求的想法: 是否應該響應數據庫死鎖而返回HTTP 503?
回答我自己的問題:
不要嘗試重復HTTP請求。
為此,即使從未發生死鎖,也將不得不為所有請求緩沖
InputStream 。
如果您被迫接受大量上傳,這將使您容易受到拒絕服務攻擊。
我建議改用這種方法:
返回HTTP 503以響應數據庫死鎖是否合適?
然后,您可以使用AJAX將大型上載分解為多個請求,將它們縫合在一起。
它雖然不漂亮,但可以工作,並且總體上應該更容易實現設計。
更新 :根據布雷特·沃爾德里奇的說法:
您需要一個最多只有幾十個連接的小型池,並且希望池中等待連接的其余應用程序線程被阻塞。
正如Hikari建議使用少量線程且請求隊列很長時一樣,我相信Web服務器也是如此。 通過限制活動線程的數量,我們限制了需要緩沖的InputStreams的數量(其余請求在發送HTTP正文之前被阻塞)。
為了進一步強調這一點, Craig Ringer建議在可能的情況下從服務器端的故障中恢復。
您可以對原始請求進行“轉發”,如下所示。
RequestDispatcher rd= request.getRequestDispatcher("/originalUrl");
rd.forward(request, response);
這里的請求和響應分別表示HttpServletRequest / HttpServletResponse。參考http://docs.oracle.com/javaee/5/api/index.html?javax/servlet/RequestDispatcher.html
或者,您可以對響應進行重定向。 但是,這將向瀏覽器發送響應,要求瀏覽器針對所提供的URL發出新請求。 如下所示
response.sendRedirect("originalUrl?neededParam=abc");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.