HTTP请求头大小写问题踩坑记录 |
您所在的位置:网站首页 › java获取post请求的请求体怎么写变量 › HTTP请求头大小写问题踩坑记录 |
场景
类似网关的需求做请求转发,大概是接收到客户端http请求后做简单处理,之后通过httpclient转发出去,其中请求头需要全部透传过去。但是直接全部无脑传过去会出现问题,比如因为处理过请求,所以长度已经变了,客户端的请求头content-length已经不再适用了,再比如如果客户端设置了accept-encoding请求头,因为压缩过所以要处理结果比较麻烦。所以这两个请求头不直接传过去。所以就出现一下代码,遍历请求头的key之后设置httpclient请求参数中,排除这两个请求头。 //请求头透传 Enumeration keys = request.getHeaderNames(); while(keys.hasMoreElements()) { String key = keys.nextElement(); //将请求头accept-encoding去掉防止用户携带后服务器返回压缩的内容处理比较麻烦 if ("accept-encoding".equals(key)) { continue; } //将请求头content-length,长度需要重新计算 if ("content-length".equals(key)) { continue; } String value = req.getHeader(key); httpRequest.setHeader(key, value); }直接写常量很不优雅,万一常量有变化岂不是很难找修改的地方,所以就使用spring提供的请求头常量做修改如下 //请求头透传 Enumeration keys = request.getHeaderNames(); while(keys.hasMoreElements()) { String key = keys.nextElement(); //将请求头accept-encoding去掉防止用户携带后服务器返回压缩的内容处理比较麻烦 if (HttpHeaders.ACCEPT_ENCODING.equals(key)) { continue; } //将请求头content-length,长度需要重新计算 if (HttpHeaders.CONTENT_LENGTH.equals(key)) { continue; } String value = req.getHeader(key); httpRequest.setHeader(key, value); }结果发现没能过滤掉这两个请求头,断点一看原来HttpServlet传过来的请求头是全部小写的比如content-length,但是spring定义的常量是首字母大写的比如Content-Length。这不都是http协议竟然还有这种不同,两个都遵守协议应该一样的,而且前端传参是首字母大写的,到HttpServlet就变成小写了,HttpServlet是tomcat传过来的,是不是tomcat做了什么特殊处理? 分析经过查阅资料和网上找答案,原来http协议header字段名大小写不敏感。https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html 所以spring的首字母大写常量或者tomcat全部转成小写也是合规的 http协议header字段名大小写不敏感的,所以每个框架的写法可能都不一样,如果需要判断请求头相等需要都考虑,做忽略大小写判断。如下 //请求头透传 Enumeration keys = request.getHeaderNames(); while(keys.hasMoreElements()) { String key = keys.nextElement(); //将请求头accept-encoding去掉防止用户携带后服务器返回压缩的内容处理比较麻烦 if (HttpHeaders.ACCEPT_ENCODING.equalsIgnoreCase(key)) { continue; } //将请求头content-length,长度需要重新计算 if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(key)) { continue; } String value = req.getHeader(key); httpRequest.setHeader(key, value); } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |