Java Spring-ServletWebRequest.getHeaderValues()未返回所有标头
我的控制器功能设置如下Java Spring-ServletWebRequest.getHeaderValues()未返回所有标头,java,spring,servlets,http-headers,request-headers,Java,Spring,Servlets,Http Headers,Request Headers,我的控制器功能设置如下 @RequestMapping(value = "/test/index.html", method = RequestMethod.GET) public ModelAndView prepareView(HttpServletRequest request, @RequestHeader HttpHeaders header) 我从这里得到了一个空指针异常 org.springframework.web.method.annotation.RequestHead
@RequestMapping(value = "/test/index.html", method = RequestMethod.GET)
public ModelAndView prepareView(HttpServletRequest request, @RequestHeader HttpHeaders header)
我从这里得到了一个空指针异常
org.springframework.web.method.annotation.RequestHeaderMapMethodArgumentResolver.resolveArgument(RequestHeaderMapMethodArgumentResolver.java:72)
所以我反编译了这个类文件,并在调试模式下逐步完成。代码中有问题的部分如下所示:
/* 70 */ for (Iterator<String> iterator = webRequest.getHeaderNames(); iterator.hasNext();) {
/* 71 */ String headerName = (String)iterator.next();
/* 72 */ for (String headerValue : webRequest.getHeaderValues(headerName)) {
/* 73 */ result.add(headerName, headerValue);
/* */ }
/* */ }
/*70*/for(迭代器迭代器=webRequest.getHeaderNames();迭代器.hasNext();){
/*71*/String headerName=(String)迭代器.next();
/*72*/for(字符串headerValue:webRequest.getheaderValue(headerName)){
/*73*/结果添加(headerName,headerValue);
/* */ }
/* */ }
webRequest
是类型为NativeWebRequest
的对象。因此在第70行中,我可以看到webRequest.getHeaderNames()
正在返回
例如,我在chrome网络选项卡中看到的请求头
显然,负载平衡器(netscaler)在创建请求后插入了一些我在chrome中看不到的头文件(我称之为x-model
)
在这个跟踪之后,我看到所有标准的requestheader都经过了检查,并且添加时没有出现任何问题(即Accept
,Cookie
,Host
,等等)。但是,第70行的迭代器最终到达x-model
头。然后在第72行中,调用了webRequest.getHeaderValues('x-model')
,由于没有找到称为x-model的头,因此返回null。这会在增强的foreach上导致空指针
为什么ServletWebRequest.getHeaderNames()
和ServletWebRequest.getHeaderValues(headerName)
返回的内容不一致?如何解决此问题
我注意到,当我查看第70行中创建的迭代器时,有一个键集hashmap,其中包含[cookie、连接、接受语言、主机、接受、用户代理、接受编码、引用器、x-model、x-tenant、升级不安全请求]
。但是,表条目不包含x-model的条目。我提到的两个对象请参见附图
我正在使用Java7和Spring4.0.7
这里的table和entryset有什么区别?为什么entryset包含
x-model
条目,而table不包含该条目?因此,问题实际上是因为有人向HttpServletRequestWrapper.getHeaderNames()
添加了一个覆盖,spring使用该覆盖来检索headernames列表,以支持,但是没有覆盖HttpServletRequestWrapper.getHeaders()
,这是spring用来查找头的值的方法这个头x-model
有值吗?有值,但是当我实际检查迭代器时,值是一个对象,奇怪的是我在迭代器中看不到这个条目。但是它必须在那里,因为它被选中了。我现在看到它在键集中,但不是表中的实际条目,你知道这是在哪里设置的吗?我想在春天里,你还能解释更多吗?值是KeySet?
非常好的捕捉。我花了半天的时间在WebRequest上搜索,这很简单,但你的回答让我很开心!谢谢。