先创建一个类继承 javax.servlet.Filter ,并重写方法 doFilter
关于Filter 的使用,可以参考之前的文章:https://blog.csdn.net/weixin_35675281/article/details/103746703
注入容器的方法:
1、通过【@Component】 声明式注入到 IOC容器中,通过spring boot 的属性【@Order】可以对filter进行排序
@Component @Order(1) public class FirstFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest servletRequest = (HttpServletRequest) request; System.out.println("FirstFilter 拦截的uri【" +servletRequest.getRequestURI()+ "】 doFilter start..."); chain.doFilter(request,response); System.out.println("FirstFilter doFilter end..."); } }
2、通过Servlet3.0规范【@WebFilter】引入,通过【@ServletComponentScan】中的【basePackages】扫描包注入到IOC容器中,其中【@ServletComponentScan】是配置在config中,而@WebFilter是放在filter中,filter的部分代码如下
@WebFilter(filterName = "secondFilter",urlPatterns ={ "/*"}) public class SecondFilter implements Filter { 。。。。 }
官方文档描述如下:
3、Spring mvc 的Config 配置bean的注入,推荐使用
@Bean public FilterRegistrationBean FilterRegistrationBean(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new FirstFilter()); filterRegistrationBean.setName("firstFilter"); filterRegistrationBean.setOrder(1); filterRegistrationBean.addUrlPatterns("/tags/*"); filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST,DispatcherType.FORWARD); return filterRegistrationBean; }
三种功能对比如下:
方法1 | 方法2 | 方法3 | |
是否可以排序 | 是 | 否 | 是 |
是否可以自定义拦截规则 | 否 | 是 | 是 |
是否可以自定义类型 | 是 | 是 | 是 |
是否可以插拔使用 | 否 | 是 | 是 |
注意事项:
- 过滤的url,是不包含 server-servlet-context-path 的内容的
如果发现说错,请留言指出,我测试出来的结果是这样的