本文不再说SpringMVC中的写法,毕竟现在项目都是SpringBoot,我们还是尽量使用SpringBoot的写法,首先了解一下Filter。
说白了,就是在请求到达服务器之前进行拦截,一般使用场景是拦截登录进行权限校验,当然一般是使用权限框架中提供的过滤器去处理,我们这里主要作为理解为什么需要它,工作原理是什么。
1.过滤器的生命周期
Ⅰ.init()方法:在程序启动时就会执行,并且只执行一次,后续再有请求过来也不会执行。
Ⅱ.doFilter()方法:这个主要是拦截到请求,进行业务处理,例如权限校验。
Ⅲ.destory()方法:当我们关闭程序时会主执行该方法。
2.创建过滤器,重写方法
@Slf4j
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("过滤器-------init初始化执行了");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("过滤器------doFilter方法执行了");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {log.info("过滤器------销毁了");}}
我们重写它的生命周期方法。重点关注一下doFilter这个方法,这个就是我们里面做重要业务逻辑处理的方法,即便以后遇到认证框架提供的过滤器,也会有相类似的方法,他的原理跟这个类似,
filterChain.doFilter(servletRequest, servletResponse);这个方法是代表放行的,如果在里面判断不符合或者是不想让这个请求过去,直接return;。基本上认证框架也是这个原理。
3.配置过滤器,交给Spring管理
@Configuration
public class FilterConfig {@Beanpublic 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方法中进行对应的操作。