首页 文章

在apache tomcat中传输body之前分析HTTP头

提问于
浏览
0

是否有可能在传输正文之前分析HTTP-(POST)-Request的标头?

如果他试图通过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是否能够在传输孔请求之前分析 Headers .

编辑:卷曲

> 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
<

2 回答

  • 0

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

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

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

  • 2

    你编写一个java脚本函数并将它绑定在输入类型=“文件”文件[0]上的onchange事件.size将给你文件的大小 . 所以你可以检查它是否可上传 .

    谢谢

相关问题