如何从 HttpServlet 关闭 HTTP 连接

Posted

技术标签:

【中文标题】如何从 HttpServlet 关闭 HTTP 连接【英文标题】:How to close a HTTP connection from the HttpServlet 【发布时间】:2011-03-07 15:55:26 【问题描述】:

我在 Tomcat 6.0.26 中运行一个 servlet。 servlet 通过 HTTP POST 接受来自客户端的文件上传。我想停止从 HttpServlet 端上传文件。我尝试了以下方法,但没有成功:

    关闭请求输入流 发送错误代码 HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE 并刷新响应 在过滤器中执行 1 和 2

我用谷歌搜索,但没有找到直接的答案。请提供解决方案。

谢谢。

【问题讨论】:

【参考方案1】:

这里有一些疯狂的解决方法:您可以编写(或在某处找到)一些基于套接字的防火墙独立应用程序,这些应用程序处理 HTTP 请求、解析标头以及如果请求符合您的某些自定义条件 - 防火墙将其转发到 Tomcat,否则返回 HTTP错误响应。或者您可以尝试使用一些 Apache 规则调整 Apache Tomcat。

【讨论】:

【参考方案2】:

使用标准 API 无法做到这一点。如果你这样做,你就违反了一些协议标准/RFC。那你为什么要这么做?

相反,发送一个没有 http 正文的“连接:关闭”响应(http 标头)。

【讨论】:

【参考方案3】:

这在使用标准 Servlet 或 Commons FileUpload API 时是不可能的。基本上,为了能够立即中止连接,您应该物理地抓住底层套接字并关闭它。但是,此套接字由网络服务器控制。另请参阅此相关问题:How to explicitly terminate http connection from server with no response header。

不过,一些小测试已经证实,当 Commons FileUpload 的大小超过限制时,Commons FileUpload 不会在内存中缓冲整个文件。它将读取输入流,但只是忽略并丢弃读取的字节(也是已经读取的字节)。所以内存效率不一定是这里的问题。

要解决真正的问题,您基本上希望在客户端而不是服务器端验证文件大小。这可以通过 Java Applet 或 Flash 应用程序实现。比如分别JumpLoader和SWFUpload。

【讨论】:

以上是关于如何从 HttpServlet 关闭 HTTP 连接的主要内容,如果未能解决你的问题,请参考以下文章

无法解析类型 javax.servlet.http.HttpServlet。从必需的 .class 文件间接引用了它

如何列出 Wildfly 部署的 http servlet

如何通过主机从外部通过 SSH 连接到 VirtualBox 来宾? [关闭]

如何从 Power BI 连接到 SQL Server 数据库? [关闭]

ided如何创建httpservlet

javax.servlet.http.HTTPServlet Import 无法解析,而包的其余部分可以正常导入