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);
/*    */         }
/*    */       }

webRequestNativeWebRequest 类型的 object。所以在第 70 行我可以看到 webRequest.getHeaderNames() 正在返回 例如,请求 header 我在 chrome 网络选项卡中看到的。

显然,负载均衡器 (netscaler) 在创建请求后插入了一些 headers(我称之为 x-model),我在 chrome.

按照此跟踪,我看到所有标准的 RequestHeaders 都通过并没有问题地添加(即 AcceptCookieHost 等)。然而,最终第 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

的值