Spring-ServletWebRequest.getHeaderValues()不返回所有标头

时间:2019-01-29 19:37:57

标签: 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.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);
/*    */         }
/*    */       }

webRequest是类型NativeWebRequest的对象。因此,在第70行中,我可以看到webRequest.getHeaderNames()返回了 例如,我在chrome网络标签中看到的请求标头。

很明显,负载平衡器(netscaler)在创建请求后会插入一些标头(我将其称为x-model),但在chrome中看不到。

在跟踪之后,我看到所有标准的RequestHeader都经过检查并且没有问题(即AcceptCookieHost等)。但是,最终第70行的迭代器到达x-model头。然后在第72行,调用webRequest.getHeaderValues('x-model'),由于没有找到称为x-model的标头,因此返回null。这会导致增强的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哈希图。但是,表条目不包含x模型的条目。请参阅附件中我引用的2个对象的图像

我正在使用Java 7和Spring 4.0.7

enter image description here

这里的表和条目集有什么区别?为什么条目集包含x-model条目,但表却不包含?

1 个答案:

答案 0 :(得分:0)

所以问题实际上是因为有人向HttpServletRequestWrapper.getHeaderNames()添加了覆盖,这是spring用来检索标头名称列表以支持包装标头的方法,但没有覆盖HttpServletRequestWrapper.getHeaders() spring用于查找标头的值