Servlet过滤器和Spring REST控制器

时间:2015-05-27 21:58:57

标签: java spring-mvc tomcat servlet-filters spring-restcontroller

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

0 个答案:

没有答案