Java Servlet : How to repeat an HTTP request?

标签 java servlets servlet-filters

如果发生数据库死锁,我想自动重复 HTTP 请求;然而,FilterChain.doFilter()被定义为单向链(因此我无法重置其状态)。

在安全的情况下,是否可以重复 HTTP 请求而无需客户端重新提交请求

更新:我刚刚发现这种方法存在问题。即使重复请求,也需要缓冲该请求InputStream 。这意味着,如果用户上传 100MB 的数据,无论是否发生死锁,您都将被迫缓冲该数据。

我正在探索让客户在此处重复请求的想法:Is it appropriate to return HTTP 503 in response to a database deadlock?

最佳答案

回答我自己的问题:

不要尝试重复 HTTP 请求。为此,您将被迫缓冲 InputStream对于所有请求,即使从未发生死锁。如果您被迫接受大量上传,这将使您面临拒绝服务攻击。

我推荐这种方法:Is it appropriate to return HTTP 503 in response to a database deadlock?

然后,您可以将大型上传分解为使用 AJAX 拼接在一起的多个请求。不太漂亮,但它有效,总的来说,你的设计应该更容易实现。

更新:根据 Brett Wooldridge :

You want a small pool of a few dozen connections at most, and you want the rest of the application threads blocked on the pool awaiting connections.

正如 Hikari 建议使用少量线程和较长的请求队列一样,我相信这对于 Web 服务器也是如此。通过限制 Activity 线程的数量,我们限制了需要缓冲的输入流的数量(剩余的请求在发送 HTTP 正文之前被阻止)。

为了进一步强调这一点,Craig Ringer建议尽可能从服务器端的故障中恢复。

关于Java Servlet : How to repeat an HTTP request?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16620003/

相关文章:

java - 正则表达式连接多个匹配项

Java游戏: limit visibility of board dependent on location of player

java - 如何根据Content-type添加响应头;在提交响应之前获取内容类型

java - jsp 重定向不起作用

java - 如何制作过滤器以检测用户是否请求了未找到的页面?

java - web.xml 中映射的 Filter 实现中的 Spring 注入(inject)

java - Log4J dailyrolling appender 截断每日文件

java - 如何每次使用列表中的不同值来应用使用 .map lambda 表达式的操作?

java - 加载索引页时调用 Servlet

java - 这是在 Java 中创建允许任何来源的 CORS 过滤器的好方法吗?