在apache tomcat

时间:2015-08-28 14:06:31

标签: java tomcat servlets servlet-filters

是否可以在传输正文之前分析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是否能够在传输孔请求之前分析标头。

编辑:卷曲

> 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 :(得分:2)

是的,这是可能的,我实际上是在Tomcat 6中执行此操作。我没有尝试过Filter,而是尝试了特定于Tomcat的Valve。如果此解决方案作为Vavle使用,请随意将其移至Filter

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

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

答案 1 :(得分:0)

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

THX