过滤器
过滤器简介与简单实现
实现过滤器只需要实现javax.servlet.Filter
接口即可。
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("执行开始...");
chain.doFilter(request, response);
System.out.println("执行结束...");
}
@Override
public void destroy() {
}
}
注册过滤器到Spring中
在 Spring Boot 项目中注册过滤器
在Spring Boot 项目之中注册过滤器可以通过以下几种方式:
- 直接将过滤器声明为一个Spring Bean
- 通过将FilterRegistrationBean声明为Spring Bean作为
注意:
- 两种方式的区别在于:第一种方式不能够设置拦截的Url,默认拦截是
/*
,而第二种方式你可以通过FilterRegistrationBean中的setUrlPatterns
来设置拦截的Url- 两种方式都可以设置Filter在整个应用过滤链中的顺序:第一种方式通过
@Order
注解指定在整个应用过滤链中的位置,第二种方式通过FilterRegistrationBean中的setOrder
来设置- 以上两种方式实际上都将过滤器声明成了一个
Spring Bean
,因此我们可以使用依赖注入。
查看Spring中的过滤器链
上面提到的应用过滤链是位于各种过滤器链的顶端。你可能会说为什么会有各种过滤器链,过滤器链不是只有一条吗?虽然在这篇文章的场景下只有一种过滤链,即应用过滤链,但是在使用spring security,shiro等类似框架时,他们往往是通过在ApplicationFilterChain
先注册一个顶级过滤器,然后在这个过滤器中定义一条虚拟过滤器链,从而实现自己的过滤器链。实现的原理效果如下图所示:
如果你想查看实际效果,可以通过debug方式,并且一直追溯调用栈![]()