SpringBoot Filter过滤器的使用篇

Filter生命周期

  • 程序启动调用Filter的init()方法(永远只调用一次);
  • 程序停止调用Filter的destroy()方法(永远只调用一次);
  • doFilter()方法每次的访问请求如果符合拦截条件都会调用(程序第一次运行,会在servlet调用init()方法以后调用;
  • 不管第几次,都在调用doGet(),doPost()方法之前)。

Filter的使用

无论哪种方式都需要先定义一个Filter

java 复制代码
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化myFilter过滤器");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("进入MyFilter过滤器 ");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("MyFilter处理一下服务端返回的response");
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
        System.out.println("销毁MyFilter过滤器");
    }
}

一、注解配置

java 复制代码
package org.example.springbootfilter.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import org.springframework.core.annotation.Order;

import java.io.IOException;

@Order(1)
@WebFilter(filterName = "myFilter1", urlPatterns = {"/filter/*"})
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化myFilter过滤器");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("进入MyFilter过滤器 ");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("MyFilter处理一下服务端返回的response");
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
        System.out.println("销毁MyFilter过滤器");
    }
}

代码说明:

1.@WebFilter 注解,filterName 属性表示filter的名称,urlPatter表示要拦截的URL资源,可以是一个或者多个。

2.**@Order(1)**表示如果有多个拦截器的话就是设置这个拦截器的运行等级,数字越小,越先执行

3.**init()**方法只会执行一次,初始化过滤器。

4.**doFilter()**核心方法,配置过滤器的逻辑代码。

5.**destroy()**只会在项目停止或者是项目重新部署的时候才会执行。

开启扫描配置:

java 复制代码
package org.example.springbootfilter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan
@SpringBootApplication
public class SpringBootFilterApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootFilterApplication.class, args);
    }
}

配置完上面的之后我们还需要在启动类加上一个扫描包的注解,开启包扫描。@ServletComponentScan("com.example.springbootfilter.filter"),当然你也可以不用写包的具体地址,不传参数,但是建议是传参数,并且这个采参数也可以传多个的。

以上就完成了一个Filter的基本配置,运行项目即可看到效果,还有一种非注解形式的配置方式。

二、Java配置

使用 @Configuration + @Bean配置。

java 复制代码
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean registFilter(){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setName("Filter1");
        registrationBean.setOrder(1);
        return registrationBean;
    }
}

Github:

完整的代码github: https://github.com/chenguowei/project_java/blob/main/spring-boot-examples-demo/spring-boot-filter/README.md

相关推荐
二哈赛车手7 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~8 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8298 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
candyTong9 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
未若君雅裁9 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
GetcharZp10 小时前
GitHub 2.4 万 Star!D2 正在重新定义程序员画图方式
后端
阿维的博客日记10 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI10 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
辰海Coding12 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构