springboot拦截器过滤器
时间: 2025-05-17 08:26:55 浏览: 22
### Spring Boot 拦截器与过滤器的用法及区别
#### 一、概念介绍
- **拦截器(Interceptor)** 是一种基于 Java 的反射机制,在 AOP 编程中的体现之一。它主要用于拦截用户的请求并对其进行预处理和后处理操作[^1]。
- **过滤器(Filter)** 则是由 Servlet 容器提供的一种技术,能够对所有的 HTTP 请求和响应进行拦截,并对其内容或头信息进行修改[^5]。
#### 二、核心区别
| 特性 | 拦截器(Interceptor) | 过滤器(Filter) |
|---------------------|---------------------------------------------|------------------------------------------|
| **触发时机** | 只能拦截 Controller 处理的请求 | 能够拦截所有经过容器的请求 |
| **依赖关系** | 需要依赖于 Spring MVC | 不依赖任何框架,属于 Servlet API |
| **访问上下文** | 可以获取到更多的 Spring 上下文中对象 | 主要是针对 HttpServletRequest 和 HttpServletResponse 对象的操作 |
| **灵活性** | 更加灵活,适合复杂的业务逻辑 | 较为简单,适用于简单的请求/响应处理 |
上述差异决定了它们在实际开发中的不同用途[^2]。
#### 三、使用场景
##### 1. 拦截器的典型应用
- 用户权限校验:通过 `preHandle` 方法判断当前用户是否有权访问目标资源[^4]。
- 日志记录:记录请求参数、返回数据等信息以便后续分析。
- 数据转换:统一处理入参或者出参的数据格式。
##### 2. 过滤器的典型应用
- 字符编码设置:解决中文乱码问题。
- XSS 攻击防护:过滤掉恶意脚本注入的内容。
- 性能监控:统计接口调用耗时情况。
#### 四、实现步骤
以下是两种组件的具体创建与配置方式:
##### (1)拦截器的创建与配置
```java
// 创建自定义拦截器类
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token != null && validateToken(token)) { // 假设有一个验证方法
return true;
}
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false; // 如果未通过认证,则阻止继续执行
}
private boolean validateToken(String token){
// 实际验证逻辑省略...
return !token.isEmpty();
}
}
```
接着注册此拦截器至全局配置中:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public AuthInterceptor authInterceptor(){
return new AuthInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor())
.addPathPatterns("/api/**") // 应用路径模式匹配规则
.excludePathPatterns("/api/login"); // 排除某些不需要拦截的 URL
}
}
```
##### (2)过滤器的创建与配置
编写一个标准的 Filter 类型 Bean 并将其加入到应用程序生命周期里去工作:
```java
@Component
public class EncodingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
filterChain.doFilter(request,response); // 继续传递给下一个环节
}
}
```
以上代码片段展示了如何利用过滤器完成字符集调整的任务[^3]。
#### 五、执行顺序与流程
当客户端发起一次完整的 HTTP 请求到达服务端之后,整个过程会按照如下次序依次经历各个阶段:
1. 先由外部最外层的 Filters 开始逐级向下运行;
2. 当进入 DispatcherServlet 后再交予内部 Interceptors 来接管控制流;
3. 最终抵达具体的 Controllers 层面完成真正的业务计算部分后再原路返回向上走一遍相同的路径直到最后形成最终应答消息发送回前端浏览器显示出来为止。

#### 六、常见问题与解决方案
Q: 如何让我的过滤器优先于其他第三方库自带的那个生效?
A: 修改 bean definition order 或者直接指定 Order 注解数值即可达成目的。
---
阅读全文
相关推荐


















