2015-08-28 31 views
0

是否可以在传输正文之前分析HTTP-(POST) - 请求的头部?在apache tomcat中传输正文之前分析HTTP-header

我想发送一个错误给客户端,如果他试图通过HTTP-POST上传的文件大到可以处理服务器。为了改善用户体验(和安全流量),我希望通过分析内容长度标题,在上传整个文件之前发送错误响应。

我想过实施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 
< 
+0

你一定要试试 – dotvav

+0

是的,它应该工作。请记得在响应中设置“连接:关闭”。 – ZhongYu

回答

2

是的,这是可能的,我其实做这个在Tomcat中6我还没有试过,但Filter特定Tomcat的Valve。如果此解决方案作为Vavle工作,请随时将其移植到Filter

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

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

+0

我工作,但我遇到了一个奇怪的现象:当通过curl发送一个巨大的文件时,尽管内容长度标题没有超出我定义的限制,但它被413拒绝。 – woezelmann

+0

请用'--verbose'运行'curl'并显示日志。我还建议使用远程地址和端口以及标题添加一些'log.debug()'到您的阀门。这将有助于找到您的问题。 –

+0

好的,我发现内容长度问题是某种卷曲错误。但是,仍然有一些奇怪的行为:结果不是预期的,而是404。但Tomcat的access.log显示,调用了GET /apache-error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var HTTP/1.1“404”。任何想法? – woezelmann

0

你写一个Java脚本功能,并结合其在输入型onchange事件=“文件”文件[0] .size会给file.So u的大小u能检查如果它是可上传的。

THX

+0

不适用于非浏览器。 –

+0

对不起,我忘了提及它是一个REST API。我无法控制客户端代码。 – woezelmann