如何从HttpServlet关闭HTTP连接

时间:2010-06-24 06:21:06

标签: java tomcat servlet-filters

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

  1. 关闭请求输入流
  2. 发送错误代码HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE并刷新回复
  3. 在过滤器中执行1和2
  4. 我用谷歌搜索,但没有找到直接答案。请告知解决方案。

    感谢。

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

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

相反,发送没有http正文的“Connection:close”响应(http标头)。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

问题或多或少与Aborting upload from a servlet to limit file size

重复

您是否尝试过使用Apache Commons FileUpload

服务器对象中有一个setFileSizeMax方法,表示从请求中上传文件。