过滤器实现方式
- 通过FilterRegistrationBean实例注册 (优点可以设置多个自定义过滤器的顺序)
- 通过注解@WebFilter生效
exp:
public class Test1Filter implements Filter {@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest request=(HttpServletRequest)arg0;System.out.println("自定义过滤器filter1触发,拦截url:"+request.getRequestURI());arg2.doFilter(arg0,arg1);}}
public class Test2Filter implements Filter {@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest request=(HttpServletRequest)arg0;System.out.println("自定义过滤器filter2触发,拦截url:"+request.getRequestURI());arg2.doFilter(arg0,arg1);}}
import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.example.demo.filter.Test1Filter;import com.example.demo.filter.Test2Filter;@Configurationpublic class DemoConfiguration {@Beanpublic FilterRegistrationBean<Test1Filter> RegistTest1(){//通过FilterRegistrationBean实例设置优先级可以生效//通过@WebFilter无效FilterRegistrationBean<Test1Filter> bean = new FilterRegistrationBean<Test1Filter>();bean.setFilter(new Test1Filter());//注册自定义过滤器bean.setName("flilter1");//过滤器名称bean.addUrlPatterns("/*");//过滤所有路径bean.setOrder(1);//优先级,最顶级return bean;}@Beanpublic FilterRegistrationBean<Test2Filter> RegistTest2(){//通过FilterRegistrationBean实例设置优先级可以生效//通过@WebFilter无效FilterRegistrationBean<Test2Filter> bean = new FilterRegistrationBean<Test2Filter>();bean.setFilter(new Test2Filter());//注册自定义过滤器bean.setName("flilter2");//过滤器名称bean.addUrlPatterns("/test/*");//过滤所有路径bean.setOrder(6);//优先级,越低越优先return bean;}}
其中1第一个bean拦截所有路径,而第二个只拦截/test/*路径2第一个bean优先级设置了1,而第二个设置了6,越低越优先,所以过滤器1应该在过滤器2前面拦截运行springboot,访问/test/*请求如下图,再访问/v请求如下图只拦截了过滤器1,而过滤器2路径不匹配
