2013-05-18 59 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");