java - 在 apache tomcat 中传输 body 之前分析 HTTP-header

标签 java tomcat servlets servlet-filters

是否可以在传输正文之前分析 HTTP-(POST)-Request 的 header ?

如果客户端尝试通过 HTTP-POST 上传的文件太大,服务器无法处理,我想向客户端发送一个错误。为了改善用户体验(和安全流量),我更愿意在他上传整个文件之前通过分析 content-length-header 发送错误响应。

我想像这样实现 javax.servlet.filter:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
   if (request.getContentLength() > MAX_DOCUMENT_SIZE) {
          ObjectMapper jsonMapper = new ObjectMapper();
          Map<String, Object> jsonMap = new HashMap<>();
          jsonMap.put("messageCode", 1234);
          jsonMap.put("messageDescription", "error message");

          response.reset();
          response.setStatus(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE);
          jsonMapper.writeValue(response.getWriter(), jsonMap);
          return;
       }
    }

    chain.doFilter(request, response);
}

但我不确定 tomcat 是否能够在传输 hole 请求之前分析 header 。

编辑: curl

> CONNECT myserver.com:443 HTTP/1.1
> Host: myserver.com:443
> Proxy-Connection: Keep-Alive
> user-agent: my-test
>
< HTTP/1.0 200 Connection established
<
* Proxy replied OK to CONNECT request
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
* Server certificate: myserver.com
> POST /uploads HTTP/1.1
> Host: myserver
> Accept: */*
> user-agent: my-test
> Content-Length: 51951089
> Content-Type: application/x-www-form-urlencoded
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
< HTTP/1.1 404 Not Found
< Date: Tue, 01 Sep 2015 09:49:01 GMT
* Server WEB is not blacklisted
< Server: WEB
< X-XSS-Protection: 1; mode=block
< X-DNS-Prefetch-Control: off
< X-Content-Type-Options: nosniff
< X-Frame-Options: sameorigin
< Strict-Transport-Security: max-age=15768000 ; includeSubDomains
< Cache-Control: private
< Expires: Thu, 01 Jan 1970 01:00:00 GMT
< Content-Type: text/plain;charset=utf-8
< Content-Length: 0
< Vary: Accept-Encoding
< Connection: close
<

最佳答案

是的,这是可能的,我实际上是在 Tomcat 6 中这样做的。我没有尝试过 Filter,而是尝试了 Tomcat 特定的 Valve。如果此解决方案用作 Vavle,请随意将其移植到 Filter

让 Tomcat 调用您的阀门。您的演示代码看起来就像它应该看起来的样子,确保您发送 400(或更好的 413)以指示输入不合适。您也可以关闭连接。现在到了非常重要的部分:为了使这项工作正常进行,客户端必须 POSTPUT 请求,另外客户端必须发送一个Expect: 100-continue header 。服务器将分析所有传入的 header 并向客户端发出请求不合适的信号。这样,客户端在发送其有效载荷之前将收到 400(或更好的 413)(请求将被中止)。您将仅交换 header 并节省资源。但请注意,您的客户必须正确实现 Expect: 100-continue。 .NET 客户端没有。我强烈建议您使用 curl 来验证您的阀门是否正常工作,因为它可以正常工作。如果您希望看到此的接线头,没问题。

警告:如果客户端以 block 的形式流式传输其有效负载,您的内容长度限制将不起作用。

关于java - 在 apache tomcat 中传输 body 之前分析 HTTP-header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32272991/

相关文章:

java - ThreadPoolExecutor 在队列满时阻塞?

java - 更新 Android 选项卡图标

java - 使用 servlet 维护 <select> 语句的持久状态

java - 通过 HTTP 调用将更多值从一台服务器传输到另一台服务器的最佳方式?

java - 并发频率计数器更新java

java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean with name 'bookDaoImpl'

java - 在上下文 Tomcat 7 上启用自动部署

IIS -> Isapi_Redirect -> Tomcat

java 模拟带有重定向的post表单

java - mysql使用servlet更新用户信息的方法