Spring启动响应过滤器

时间:2017-01-24 10:13:19

标签: spring spring-mvc spring-boot

我使用过JERSEY框架,它提供了实现过滤器的功能,以便所有响应都能通过它。

我是Spring / Spring新手。我不了解如何实现我提到的上述功能。

基本上我希望我的每个响应应该通过我的过滤器。

怎么做?

示例示例将有所帮助。

如果我按照 @Errabi Ayoub 的建议实施如下:

@Component
public class MyClassFilter implements Filter {


  @Override
  public void doFilter( HttpServletRequest req,  HttpServletResponse res,
      FilterChain chain) throws IOException, ServletException {
       // you can modify your response here before the call of chain method
       //example 
        apiLogger.logResponse();
         res.setHeader("key", "value");

    chain.doFilter(req, res);
  }

  @Override
  public void destroy() {}

  @Override
  public void init(FilterConfig arg0) throws ServletException {}

}

我有一个方法apiLogger.logResponse();然后我的方法将被调用两次,根据我的逻辑,首先它将在请求时调用,然后再响应。我不想要那个。我只想在响应时记录。

感谢。

2 个答案:

答案 0 :(得分:3)

您可以通过实施过滤器接口

来实现
@Component
public class MyClassFilter implements Filter {


  @Override
  public void doFilter( HttpServletRequest req,  HttpServletResponse res,
      FilterChain chain) throws IOException, ServletException {
       // you can modify your response here before the call of chain method
       //example 
         res.setHeader("key", "value");

    chain.doFilter(req, res);
  }

  @Override
  public void destroy() {}

  @Override
  public void init(FilterConfig arg0) throws ServletException {}

}

答案 1 :(得分:0)

简短回答是在doFilter方法之后过滤响应。

    @Bean
    public Filter myCustomFilter() {
        return (request, response, chain) -> {
            logger.info("do Request Filtering ... ");
            chain.doFilter(request, response); // Do Response Filter after this
            logger.info("do Response Filtering ... ");
        };
    }

说明

Servlet容器中的Servlet过滤器在链中被调用,每个过滤器通过FilterChain doFilter方法调用链中的下一个过滤器。过滤器链中的最后一个过滤器将请求委托给实际的Servlet,然后由该Servlet处理请求并生成响应。然后,响应以相反的顺序通过“过滤器链”中的每个过滤器。因此,最后一个过滤器在处理响应时成为第一个过滤器,并通过所有过滤器返回给客户端。

enter image description here