借助FilterRegistrationBean来注册filter,可以避免在web.xml种配置filter这种原始的写法
现在借助servlet中的接口Filter定义三个filter
public class MyFilter1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println(filterConfig.getInitParameter("a"));//获取参数值 System.out.println("执行Controller前的MyFilter1-init处理"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("执行Controller前的MyFilter1-doFilter处理"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("执行Controller后的MyFilter1-doFilter处理"); } @Override public void destroy() { System.out.println("执行Controller前的MyFilter1-destroy处理"); //项目停止的时候执行 } }
public class MyFilter2 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("执行Controller前的MyFilter2-init处理"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("执行Controller前的MyFilter2-doFilter处理"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("执行Controller后的MyFilter2-doFilter处理"); } @Override public void destroy() { System.out.println("执行Controller前的MyFilter2-destroy处理");//项目停止的时候执行 } }
public class MyFilter3 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("执行Controller前的MyFilter3-init处理"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("执行Controller前的MyFilter3-doFilter处理"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("执行Controller后的MyFilter3-doFilter处理"); } @Override public void destroy() { System.out.println("执行Controller前的MyFilter3-destroy处理");//项目停止的时候执行 } }
现在利用FilterRegistrationBean对这三个filter进行注册
@Configuration public class MyFilterConfig { @Bean public FilterRegistrationBean FilterRegistrationBean1(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.addInitParameter("a","a"); //对filter传递参数,filter可以通filterConfig来获取 bean.addInitParameter("b","b"); bean.addInitParameter("c","c"); bean.setFilter(new MyFilter1()); bean.addUrlPatterns("/*");//设置需过滤的路径 bean.setName("filter1"); bean.setOrder(1);//对order进行排序,数字越小的越先执行 return bean; } @Bean public FilterRegistrationBean FilterRegistrationBean2(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new MyFilter2()); bean.addUrlPatterns("/*"); bean.setName("filter2"); bean.setOrder(2); return bean; } @Bean public FilterRegistrationBean FilterRegistrationBean3(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new MyFilter3()); bean.addUrlPatterns("/*"); bean.setName("filter3"); bean.setOrder(3); return bean; } }
注意:如果order都没有声明(order的默认值是2147483647):则按加载的顺序,从上至下,依次执行
定义controlle:
@RestController public class IndexController { @RequestMapping(value="/") public String index(){ return "index"; } }
启动代码:
@SpringBootApplication public class ShiroPac4jTestApplication { public static void main(String[] args) { SpringApplication.run(ShiroPac4jTestApplication.class, args); } }
配置文件为:
server.port=8089
项目启动的时候,打印出日志:
执行Controller前的MyFilter1-init处理
执行Controller前的MyFilter2-init处理
执行Controller前的MyFilter3-init处理
请求http://localhost:8089/的时候,打印出日志:
执行Controller前的MyFilter1-doFilter处理
执行Controller前的MyFilter2-doFilter处理
执行Controller前的MyFilter3-doFilter处理
执行Controller后的MyFilter3-doFilter处理
执行Controller后的MyFilter2-doFilter处理
执行Controller后的MyFilter1-doFilter处理
加入filter中filterChain.doFilter(servletRequest,servletResponse);没有写则
则打印日志为:
执行Controller前的MyFilter1-doFilter处理
执行Controller前的MyFilter2-doFilter处理
执行Controller后的MyFilter2-doFilter处理
执行Controller后的MyFilter1-doFilter处理