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方法中进行对应的操作。

相关推荐
alonewolf_9925 分钟前
深入Spring核心原理:从Bean生命周期到AOP动态代理全解析
java·后端·spring
天远Date Lab26 分钟前
Python实现用户消费潜力评估:天远个人消费能力等级API对接全攻略
java·大数据·网络·python
十月南城8 小时前
Spring Cloud生态地图——注册、配置、网关、负载均衡与可观测的组合拳
spring·spring cloud·负载均衡
没有bug.的程序员8 小时前
服务安全:内部服务如何防止“裸奔”?
java·网络安全·云原生安全·服务安全·零信任架构·微服务安全·内部鉴权
一线大码8 小时前
SpringBoot 3 和 4 的版本新特性和升级要点
java·spring boot·后端
weixin_440730508 小时前
java数组整理笔记
java·开发语言·笔记
weixin_425023008 小时前
Spring Boot 实用核心技巧汇总:日期格式化、线程管控、MCP服务、AOP进阶等
java·spring boot·后端
一线大码9 小时前
Java 8-25 各个版本新特性总结
java·后端
2501_906150569 小时前
私有部署问卷系统操作实战记录-DWSurvey
java·运维·服务器·spring·开源
better_liang9 小时前
每日Java面试场景题知识点之-TCP/IP协议栈与Socket编程
java·tcp/ip·计算机网络·网络编程·socket·面试题