2013-05-18 80 views
0

如果發生數據庫死鎖,我想自動重複一個HTTP請求;然而,FilterChain.doFilter()被定義爲一個單向鏈(所以我不能重置它的狀態)。Java Servlets:如何重複HTTP請求?

在安全的情況下,可以重複HTTP請求而不需要客戶端重新提交請求

UPDATE:我剛發現這個方法有問題。即使您重複請求,您也需要緩衝請求InputStream。這意味着如果用戶上傳100MB數據,則不管是否發生死鎖,您都將被迫緩衝該數據。

我正在探索讓客戶在這裏重複請求的想法:Is it appropriate to return HTTP 503 in response to a database deadlock?

回答

1

回答我的問題:

不要試圖重複一個HTTP請求。爲了這樣做,即使永遠不會發生死鎖,您也將被迫緩衝所有請求的 InputStream。如果您不得不接受大量上傳,這會使您面臨拒絕服務攻擊。

我推薦這種方法代替:Is it appropriate to return HTTP 503 in response to a database deadlock?

然後,您可以打破大上載到使用AJAX縫合在一起的多個請求。不漂亮,但它的工作原理,整體而言,您的設計應該更容易實施。

UPDATE:根據Brett Wooldridge

你想頂多幾十連接的小水池,你想擋在了池等待連接的應用程序線程的其餘部分。

就像Hikari推薦的少量線程有很長的請求隊列一樣,我相信Web服務器也是如此。通過限制活動線程的數量,我們限制了我們需要緩衝的InputStream的數量(其餘請求在發送HTTP主體之前被阻塞)。

爲了進一步強化這一點,Craig Ringer建議儘可能從服務器端的故障中恢復。

0

你可以做一個原始請求的「前進」像下面。

RequestDispatcher rd= request.getRequestDispatcher("/originalUrl"); 
rd.forward(request, response); 

這裏請求和響應代表的HttpServletRequest/HttpServletResponse的respectively.Refer http://docs.oracle.com/javaee/5/api/index.html?javax/servlet/RequestDispatcher.html

或者你可以做響應重定向。然而,這會向瀏覽器發送一個響應,要求它爲所提供的URL發出一個新的請求。請看下面

response.sendRedirect("originalUrl?neededParam=abc");