如何从HttpServlet关闭HTTP连接

11

我正在Tomcat 6.0.26中运行一个Servlet。该Servlet通过HTTP POST从客户端接受文件上传。我希望能够从HttpServlet侧停止文件上传。我尝试了以下方法,但都没有成功:

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

我搜索了一下Google,但没有找到直接的答案。请提供解决方案。

谢谢。

3个回答

5
这不可以使用标准的Servlet或Commons FileUpload API来实现。基本上,要立即中止连接,您应该物理地抓住底层套接字并将其关闭。然而,这个套接字由Web服务器控制。另请参阅相关问题:如何从没有响应头的服务器显式终止http连接
但小测试已经证实,在文件大小超过限制时,Commons FileUpload并不会在内存中缓存整个文件。它将读取输入流,但只是忽略和丢弃已读取的字节(包括已经读取的字节)。因此,内存效率并不一定是问题所在。
要解决真正的问题,你基本上想在客户端而不是服务器端验证文件大小。这可以通过Java Applet或Flash应用程序完成。例如,分别有JumpLoaderSWFUpload

4

使用标准API是不可能实现的。如果这样做,您将违反某些协议标准/RFC。那么为什么要这样做呢?

相反,发送一个带有空HTTP正文的“Connection: close”响应(HTTP头)。


3

以下是一些疯狂的解决方法:您可以编写(或在其他地方找到)基于套接字的防火墙独立应用程序,该应用程序处理HTTP请求,解析标头,并且如果请求匹配某些自定义条件,则防火墙将其转发到Tomcat,否则返回HTTP错误响应。或者,您可以尝试使用一些Apache规则来调整Apache <-> Tomcat。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接