springboot拦截器和过滤器执行顺序
时间: 2024-08-22 09:01:49 浏览: 104
Spring Boot 中的拦截器(Interceptor)和过滤器(Filter)都是用于处理请求流程的组件,但它们的应用场景和执行顺序有所不同。
1. **过滤器(Filters)**:Spring MVC 的过滤器主要用于预处理器阶段(pre-process),即在控制器处理请求之前执行。过滤器的执行顺序通常由Spring 官方容器按照配置文件中的`<filter>`元素声明的`order`属性来确定。默认情况下,如果两个过滤器的`order`值相等,它们将以注册的顺序执行。
2. **拦截器(Interceptors)**:Spring MVC 拦截器更专注于对控制器方法的增强或修改,一般应用于方法级,如日志记录、权限验证等。拦截器也是基于配置的`@ControllerAdvice`注解的切面编程(AOP)实现。拦截器的执行顺序在Spring AOP中是由AspectJ自动管理的,通常是自底向上(从最具体的切点开始到最一般的切点结束)。
总结来说,过滤器主要关注的是请求的进入和离开,拦截器则关注业务逻辑的特定部分。当同时存在过滤器和拦截器时,过滤器先执行,然后是任意数量的拦截器,最后是被拦截的方法。
相关问题
springboot拦截器和过滤器
Spring Boot中的拦截器和过滤器具有不同的实现方式、作用范围和使用场景。拦截器是基于Spring MVC的组件,作用于具体的控制器方法,可以访问Spring MVC的上下文。而过滤器是基于Servlet规范的组件,作用于整个请求和响应过程,无法直接访问Spring MVC的上下文。拦截器是由Spring提供和管理的,可以在拦截器中注入一个service,以调用业务逻辑。而过滤器只需依赖servlet api,不需要依赖Spring。过滤器先于拦截器执行,过滤器的执行顺序由注册顺序决定,而拦截器的执行顺序由配置的顺序决定。在Spring Boot中,可以通过注解@WebFilter来简化过滤器的注册,它会自动注册并配置过滤器,可以通过设置urlPatterns属性指定过滤器的拦截路径,也可以通过value属性设置过滤器的名称。\[1\]\[2\]\[3\]
#### 引用[.reference_title]
- *1* [springboot过滤器和拦截器](https://blog.csdn.net/qq_42076204/article/details/125215984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* *3* [springboot中拦截器和过滤器详细说明](https://blog.csdn.net/xiaoweiwei11/article/details/130860352)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
springboot拦截器过滤器
### 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 注解数值即可达成目的。
---
阅读全文
相关推荐
















