我有一个简单的 Servlet 过滤器,它在请求中查找标头,如果标头丢失,则在将实际请求发送到 Spring Rest 控制器类之前为其设置一个值。
示例:客户端代码设置 foo=bar,然后过滤器不做任何事情。如果客户端没有设置它,那么过滤器会设置一些东西。
当我将实现切换到一个普通的 Java servlet 时,servlet 会看到过滤器设置的标头值。
Rest 控制器得到的是实际客户端设置的标头。
示例:客户端设置标头 foo=bar,然后控制器获取“foo”的值 bar。
假设客户端没有设置 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.
}
小服务程序代码:
@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。