Spring - ServletWebRequest.getHeaderValues() 没有返回全部 headers
Spring - ServletWebRequest.getHeaderValues() not returning all headers
我的控制器功能是这样设置的
@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)
所以我反编译了这个 class 文件并在调试模式下单步执行。代码中有问题的部分如下所示:
/* 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);
/* */ }
/* */ }
webRequest
是 NativeWebRequest
类型的 object。所以在第 70 行我可以看到 webRequest.getHeaderNames()
正在返回
例如,请求 header 我在 chrome 网络选项卡中看到的。
显然,负载均衡器 (netscaler) 在创建请求后插入了一些 headers(我称之为 x-model
),我在 chrome.
按照此跟踪,我看到所有标准的 RequestHeaders 都通过并没有问题地添加(即 Accept
、Cookie
、Host
等)。然而,最终第 70 行的迭代器到达 x-model
header。然后在第 72 行,调用了 webRequest.getHeaderValues('x-model')
,并且找到了这个 returns null,因为没有 header 调用 x-model。这会导致增强的 foreach 上出现空指针。
为什么 ServletWebRequest.getHeaderNames()
和 ServletWebRequest.getHeaderValues(headerName)
返回的内容不一致?我该怎么做才能解决这个问题?
我注意到当我查看第 70 行中创建的迭代器时,有一个包含 [cookie, connection, accept-language, host, accept, user-agent, accept-encoding, referer, x-model, x-tenant, upgrade-insecure-requests]
的 keySet hashmap。但是,table 条目不包含 x-model 的条目。请参阅我提到的 2 object 的附件图片
我正在使用 Java 7 和 Spring 4.0.7
这里的table和entryset有什么区别?为什么条目集包含 x-model
条目但 table 不包含?
所以问题实际上是因为有人向 HttpServletRequestWrapper.getHeaderNames()
添加了覆盖,spring 用来检索 header 名称列表以支持包装器 header,但没有覆盖 HttpServletRequestWrapper.getHeaders()
,spring 用来查找 header
的值
我的控制器功能是这样设置的
@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)
所以我反编译了这个 class 文件并在调试模式下单步执行。代码中有问题的部分如下所示:
/* 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);
/* */ }
/* */ }
webRequest
是 NativeWebRequest
类型的 object。所以在第 70 行我可以看到 webRequest.getHeaderNames()
正在返回
例如,请求 header 我在 chrome 网络选项卡中看到的。
显然,负载均衡器 (netscaler) 在创建请求后插入了一些 headers(我称之为 x-model
),我在 chrome.
按照此跟踪,我看到所有标准的 RequestHeaders 都通过并没有问题地添加(即 Accept
、Cookie
、Host
等)。然而,最终第 70 行的迭代器到达 x-model
header。然后在第 72 行,调用了 webRequest.getHeaderValues('x-model')
,并且找到了这个 returns null,因为没有 header 调用 x-model。这会导致增强的 foreach 上出现空指针。
为什么 ServletWebRequest.getHeaderNames()
和 ServletWebRequest.getHeaderValues(headerName)
返回的内容不一致?我该怎么做才能解决这个问题?
我注意到当我查看第 70 行中创建的迭代器时,有一个包含 [cookie, connection, accept-language, host, accept, user-agent, accept-encoding, referer, x-model, x-tenant, upgrade-insecure-requests]
的 keySet hashmap。但是,table 条目不包含 x-model 的条目。请参阅我提到的 2 object 的附件图片
我正在使用 Java 7 和 Spring 4.0.7
这里的table和entryset有什么区别?为什么条目集包含 x-model
条目但 table 不包含?
所以问题实际上是因为有人向 HttpServletRequestWrapper.getHeaderNames()
添加了覆盖,spring 用来检索 header 名称列表以支持包装器 header,但没有覆盖 HttpServletRequestWrapper.getHeaders()
,spring 用来查找 header