2

我有一个简单的 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。

4

0 回答 0