簡體   English   中英

Java Servlet:如何重復HTTP請求?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM