Spring Boot中如何使用过滤器

版权声明:本文为博主原创文章,转载请标注出处。 https://blog.csdn.net/qq27Ke/article/details/82193532
1,定义过滤器和设置调用顺序

假设定义两个过滤器:

 1,事物过滤器:开启和提交事物操作
 2,请求响应日志过滤器:记录请求和响应日志

和原始过滤器一样,我们需要实现Filter接口:

@Component
@Order(1)
public class TransactionFilter implements Filter {

    @Override
    public void doFilter
      ServletRequest request, 
      ServletResponse response, 
      FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        LOG.info(
          "Starting a transaction for req : {}", 
          req.getRequestURI());

        chain.doFilter(request, response);
        LOG.info(
          "Committing a transaction for req : {}", 
          req.getRequestURI());
    }

    // other methods 
}

>

@Component
@Order(2)
public class RequestResponseLoggingFilter implements Filter {

    @Override
    public void doFilter(
      ServletRequest request, 
      ServletResponse response, 
      FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        LOG.info(
          "Logging Request  {} : {}", req.getMethod(), 
          req.getRequestURI());
        chain.doFilter(request, response);
        LOG.info(
          "Logging Response :{}", 
          res.getContentType());
    }

    // other methods
}

通过使用@Order来定义过滤器的执行顺序。

2,过滤器的url patterns

我们的过滤器默认为我们的应用程序中的所有URL注册。但是,有时我们希望过滤器只适用于某些URL patterns,只过滤我们指定的请求。这个时候我们就使用FilterRegistrationBean注册筛选器:

@Bean
public FilterRegistrationBean<RequestResponseLoggingFilter> loggingFilter(){
    FilterRegistrationBean<RequestResponseLoggingFilter> registrationBean 
      = new FilterRegistrationBean<>();

    registrationBean.setFilter(new RequestResponseLoggingFilter());
    registrationBean.addUrlPatterns("/users/*");

    return registrationBean;    
}
3,代码演示

创建一个查询用户列表的api请求:

@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping()
    public List<User> getAllUsers() {
        // ...
    }
}

请求这个api所打印的日志:

23:54:38 INFO  com.spring.demo.TransactionFilter - Starting Transaction for req :/users
23:54:38 INFO  c.s.d.RequestResponseLoggingFilter - Logging Request  GET : /users
...
23:54:38 INFO  c.s.d.RequestResponseLoggingFilter - Logging Response :application/json;charset=UTF-8
23:54:38 INFO  com.spring.demo.TransactionFilter - Committing Transaction for req :/users

这证实了按期望的顺序调用过滤器。

猜你喜欢

转载自blog.csdn.net/qq27Ke/article/details/82193532