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
这证实了按期望的顺序调用过滤器。