是否有可能在传输正文之前分析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 回答
是的,这是可能的,我实际上在Tomcat 6中这样做 . 我没有尝试
Filter
但是特定于Tomcat的Valve
. 如果此解决方案作为Vavle
工作,请随意将其移植到Filter
.让Tomcat调用你的阀门 . 您的演示代码看起来应该是它应该看起来的样子,确保发送
400
(或更好的413
)来指示输入不合适 . 您也可以关闭连接 . 现在这里有非常重要的部分:为了使这项工作,客户端必须POST
或PUT
请求,另外客户端 must 发送Expect: 100-continue
标头 . 服务器将分析所有传入的标头,并向客户端发出请求不合适的信号 . 这样,客户端将在发送其有效负载之前收到400
(或更好的413
)(请求将被中止) . 您只会交换标头并节省资源 . 但要注意,您的客户必须正确实施Expect: 100-continue
. .NET客户端没有 . 我强烈建议用curl
验证阀门的正常工作情况,因为它能正确完成 . 如果你想看到这个线头,没问题 .警告:如果客户端以块的形式传输其有效负载,则内容长度限制将不起作用 .
你编写一个java脚本函数并将它绑定在输入类型=“文件”文件[0]上的onchange事件.size将给你文件的大小 . 所以你可以检查它是否可上传 .
谢谢