spring boot 过滤器简单demo
1. 过滤器(Filter)的概念
过滤器是 Java Web 应用中的一种组件,它可以在请求到达目标资源(如 Controller)之前或响应返回客户端之后,对请求和响应进行统一处理。它的核心作用是对 HTTP 请求和响应进行拦截和增强。
2. 过滤器的典型应用场景
在你的用户管理系统中,过滤器的常见用途包括:
场景 | 说明 |
---|---|
身份认证 | 拦截未登录用户的请求,强制跳转到登录页面。 |
日志记录 | 记录请求的 URL、IP、耗时等信息,用于监控和调试。 |
权限控制 | 验证用户是否有权限访问某些接口(如管理员接口)。 |
全局字符编码 | 统一设置请求和响应的编码(如 UTF-8)。 |
防止 XSS/SQL 注入 | 对请求参数进行过滤,防止恶意攻击。 |
3. 在项目中添加过滤器的步骤
以下是在 Spring Boot 中实现过滤器的两种常用方式:
方式一:使用 @WebFilter
注解(推荐)
3.1 创建过滤器类
在项目中新建 filter
包,并创建 LogFilter
类:
package com.example.spring_demo01.filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/*") // 拦截所有请求
public class LogFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 请求到达 Controller 前的逻辑
long startTime = System.currentTimeMillis();
System.out.println("请求开始: " + startTime + "ms");
// 放行请求,继续执行后续过滤器或 Controller
chain.doFilter(request, response);
// 响应返回客户端前的逻辑
long endTime = System.currentTimeMillis();
System.out.println("请求结束,耗时: " + (endTime - startTime) + "ms");
}
}
3.2 启用过滤器扫描
在启动类 SpringDemo01Application
上添加 @ServletComponentScan
注解:
@SpringBootApplication
@ServletComponentScan // 启用 Servlet 组件扫描(如 Filter、Servlet)
public class SpringDemo01Application {
public static void main(String[] args) {
SpringApplication.run(SpringDemo01Application.class, args);
}
}
方式二:通过 FilterRegistrationBean
注册
3.1 创建过滤器类(无需注解)
package com.example.spring_demo01.filter;
import javax.servlet.*;
import java.io.IOException;
public class AuthFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 模拟检查 Token
String token = request.getParameter("token");
if (token == null || !token.equals("123456")) {
response.getWriter().write("请先登录!");
return;
}
chain.doFilter(request, response);
}
}
3.2 注册过滤器到 Spring 容器
新建配置类 FilterConfig
:
package com.example.spring_demo01.config;
import com.example.spring_demo01.filter.AuthFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<AuthFilter> authFilter() {
FilterRegistrationBean<AuthFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new AuthFilter());
registration.addUrlPatterns("/user/*"); // 仅拦截用户相关接口
registration.setOrder(1); // 设置执行顺序(值越小优先级越高)
return registration;
}
}
4. 测试过滤器的效果
4.1 测试日志过滤器
发送任意请求(如 GET /user/list
),观察控制台输出:
请求开始: 1721042400000ms
请求结束,耗时: 15ms
4.2 测试权限过滤器
访问需要 Token 的接口(如 GET /user/1
):
- 不带 Token:返回
请先登录!
- 带正确 Token:
GET /user/1?token=123456
→ 正常返回用户数据
5. 过滤器的核心注意事项
-
执行顺序
通过setOrder()
控制多个过滤器的执行顺序(值越小越先执行)。 -
性能影响
避免在过滤器中执行耗时操作(如远程调用),否则会拖慢接口响应速度。 -
静态资源拦截
若不想拦截静态资源(如 CSS/JS),可调整urlPatterns
:@WebFilter(urlPatterns = {"/api/*", "/admin/*"}) // 仅拦截 API 和管理端接口
-
排除特定路径
Spring Boot 中可通过FilterRegistrationBean
排除路径:registration.addInitParameter("exclusions", "/login,/static/*");
6. 完整项目结构参考
src/
├── main/
│ ├── java/
│ │ └── com/example/spring_demo01/
│ │ ├── SpringDemo01Application.java
│ │ ├── config/
│ │ │ ├── FilterConfig.java // 过滤器配置
│ │ │ └── MyBatisPlusConfig.java
│ │ ├── controller/
│ │ ├── entity/
│ │ ├── filter/ // 存放过滤器
│ │ │ ├── LogFilter.java
│ │ │ └── AuthFilter.java
│ │ ├── mapper/
│ │ └── service/
│ └── resources/
└── test/
通过添加过滤器,你可以轻松实现统一的权限控制、日志记录等功能,无需在每个 Controller 中重复编写相同逻辑。