实现过滤器只需要实现 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 Boot 项目之中注册过滤器可以通过以下几种方式:
注意:
/*
,而第二种方式你可以通过FilterRegistrationBean中的 setUrlPatterns
来设置拦截的Url @Order
注解指定在整个 应用过滤链 中的位置,第二种方式通过FilterRegistrationBean中的 setOrder
来设置 Spring Bean
,因此我们可以使用依赖注入。 上面提到的 应用过滤链 是位于各种过滤器链的顶端。你可能会说为什么会有 各种过滤器链 ,过滤器链不是只有一条吗?虽然在这篇文章的场景下只有一种过滤链,即应用过滤链,但是在使用spring security,shiro等类似框架时,他们往往是通过在 ApplicationFilterChain
先注册一个顶级过滤器,然后在这个过滤器中定义一条虚拟过滤器链,从而实现自己的过滤器链。实现的原理效果如下图所示:
如果你想查看实际效果,可以通过debug方式,并且一直追溯调用栈