SpringBoot中如何自定义自己的过滤器Filter(简易版)

本文不再说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方法中进行对应的操作。

相关推荐
西峰u39 分钟前
Java单例模式|从基础到多线程安全
java·java单例模式
ClinicTech41 分钟前
实验室洗瓶机的清洗系统架构与自动化控制解析
java·python
linmengmeng_13141 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
木井巳1 小时前
【记忆化搜索】不同路径
java·算法·leetcode·深度优先·剪枝·推荐算法
Sam_Deep_Thinking1 小时前
new Thread()之后发生了什么?
java·后端·面试·程序员
泡海椒1 小时前
规则引擎对比:JQuick-Java vs Drools 轻量场景选型对比
java·开发语言
wno7041 小时前
Spring Security短信验证码登录
java·python·spring
步行cgn1 小时前
Spring util 命名空间详解
java·后端·spring
古法安卓2 小时前
Android-休眠唤醒后onLocationChanged没有数据问题排查
android·java·android studio
周GZ2 小时前
简单讲解线程池的4种拒绝策略
java