本文不再说SpringMVC中的写法,毕竟现在项目都是SpringBoot,我们还是尽量使用SpringBoot的写法,首先了解一下Filter。
说白了,就是在请求到达服务器之前进行拦截,一般使用场景是拦截登录进行权限校验,当然一般是使用权限框架中提供的过滤器去处理,我们这里主要作为理解为什么需要它,工作原理是什么。
1.过滤器的生命周期
Ⅰ.**init()**方法:在程序启动时就会执行,并且只执行一次,后续再有请求过来也不会执行。
Ⅱ.**doFilter()**方法:这个主要是拦截到请求,进行业务处理,例如权限校验。
Ⅲ.**destory()**方法:当我们关闭程序时会主执行该方法。
2.创建过滤器,重写方法
java
@Slf4j
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("过滤器-------init初始化执行了");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("过滤器------doFilter方法执行了");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
log.info("过滤器------销毁了");
}
}
我们重写它的生命周期方法。重点关注一下doFilter这个方法,这个就是我们里面做重要业务逻辑处理的方法,即便以后遇到认证框架提供的过滤器,也会有相类似的方法,他的原理跟这个类似,
filterChain.doFilter(servletRequest, servletResponse);这个方法是代表放行的,如果在里面判断不符合或者是不想让这个请求过去,直接return;。基本上认证框架也是这个原理。
3.配置过滤器,交给Spring管理
java
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter> myFilterRegistration() {
FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/test1/*","test2/*"); //设置拦截的路径规则
registrationBean.setName("MyFilter");
return registrationBean;
}
}
其实就是配置了一个FilterRegistrationBean,设置过滤器为刚才我们自己创建的过滤器MyFilter,设置拦截的路径规则,例如/test1/*,这个他是不定参数,可以配置多个拦截路径,这里需要注意一下,正常来说/*只拦截当前路径,不会拦截子路径,而/**是会拦截所有路径的,但是在这个类里面,我测试的结果是/*会拦截所有的路径,例如/test1/*会拦截/test1/aa和/test1/aa/bb,而/test1/**什么都不会拦截,我觉得他可能把**当作一个普通字符串去看待了,不过在正常的认证框架里还是用的/**,这里作为了解即可。
接下来就是,一旦拦截到符合路径规则的请求,就会到doFilter方法中进行对应的操作。