我有一个简单的Servlet过滤器,它在请求中查找标头,如果缺少标头,那么它会在将实际请求发送到Spring Rest控制器类之前为其设置一个值。
示例:客户端代码设置foo = bar,然后过滤器不执行任何操作。如果客户端没有设置它,那么过滤器会设置一些内容。
当我将实现切换到普通的Java servlet时,servlet会看到过滤器设置的标头值。
Rest控制器获取的是实际客户端设置的标头。
示例:客户端设置标头foo = bar,然后控制器获取“foo”的值栏。
假设客户端没有设置foo的值并且过滤器设置了它,那么控制器就不会看到它并且它将值变为null。
春季休息代码:
@ResponseBody
public ResponseEntity<Foo> process(@PathVariable(value="myValue") String myValue, @RequestHeader HttpHeaders headers) {
logger.info("Foo header value is " + header.get("foo"));
//Gets printed as null when the filter sets the value
//Prints the actual value when the client code sets it.
}
Servlet代码:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
logger.info("Foo header is " + req.getHeader("foo"));
//Prints the value all the time
//When Client sets it, then it prints the value set by Client
//When Client does not set it, then it prints the value set by Filter
}
有趣的是,当我在Rest Controller中有这样的东西时,我得到了标题值,我自动连接了HttpServletRequest对象。
显然我看到Spring的HttpHeaders忽略了过滤器设置的标头值。
@Autowired
HttpServletRequest req;
@ResponseBody
public ResponseEntity<Foo> process(@PathVariable(value="myValue") String myValue) {
logger.info("Foo value is " + req.getHeader("foo"));
//Now I get it all the time
}
想知道问题是什么。
我的环境是Spring 4,Java 8和Tomcat 8。