基于注解实现过滤器
实现基础的过滤器, 可以直接用注解的方式实现, 其中要注意的有两点:
- 主启动类要加 servletComponentScan
- 一定要执行最后一句, 不然不会执行 servlet 的 service 方法, 也就不会执行你的业务方法
filterChain.doFilter(servletRequest, servletResponse); 另外 urlPatterns 支持 /* 通配, 但不支持 /**/abc 通配
@Order(2)
@WebFilter(urlPatterns={"/*"})
public class DemoFilter01 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println( "Filter01 执行了");
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Order(1)
@WebFilter(urlPatterns={"/**/test1"})
public class DemoFilter02 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println( "Filter02 执行了");
filterChain.doFilter(servletRequest, servletResponse);
}
}
@WebFilter(urlPatterns={"/aaa"})
public class DemoFilter03 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println( "Filter03 执行了");
filterChain.doFilter(servletRequest, servletResponse);
}
}
访问地址 localhost:8080/demo/test1 ,得到以下输出, 加了 order, 经证实对执行顺序没有用
基于配置类实现过滤器
基于配置类实现过滤, 则以上代码可以去掉注解
//@WebFilter(urlPatterns={"/*"})
public class DemoFilter01 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println( "Filter01 执行了");
filterChain.doFilter(servletRequest, servletResponse);
}
}
然后声明一个配置类, 在类中声明过滤器类
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registrationBean(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
DemoFilter01 demoFilter01 = new DemoFilter01();
filterRegistrationBean.setFilter(demoFilter01);
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setName("regist01");
filterRegistrationBean.setOrder(3);
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean registrationBean2(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
DemoFilter02 demoFilter02 = new DemoFilter02();
filterRegistrationBean.setFilter(demoFilter02);
filterRegistrationBean.addUrlPatterns("/demo/test1");
filterRegistrationBean.setName("regist02");
filterRegistrationBean.setOrder(2);
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean registrationBean3(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
DemoFilter03 demoFilter03 = new DemoFilter03();
filterRegistrationBean.setFilter(demoFilter03);
filterRegistrationBean.addUrlPatterns("/aaa");
filterRegistrationBean.setName("regist03");
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
}
依然访问 localhost:8080/demo/test1 ,得到以下输出 ( 注意代码的 order设置和输出顺序, 证明这种方式的 order 是生效的)
以上就是 springboot 的两种过滤器实现方式了, 记录一下, 也分享给需要的朋友们.