拦截器和过滤器的执行流程
时间: 2025-06-30 07:18:26 浏览: 0
### 三级标题:Spring Boot 拦截器与过滤器的执行顺序和流程
在Spring Boot应用中,HTTP请求处理过程中涉及到多个组件,其中**过滤器(Filter)**和**拦截器(Interceptor)**是两个关键角色。它们分别处于不同的阶段,具有明确的执行顺序和作用范围。
#### 过滤器(Filter)的执行时机
过滤器是Servlet规范的一部分,属于更底层的Web容器机制。当一个HTTP请求进入应用时,首先会经过一系列的Filter链。这些过滤器可以用于实现诸如字符编码设置、日志记录、安全控制等功能。每个Filter都可以决定是否将请求传递给下一个Filter或者直接响应客户端。因此,Filter的执行是在DispatcherServlet处理请求之前和之后进行的,且对所有资源都生效[^1]。
```java
// 示例:使用 FilterRegistrationBean 注册自定义过滤器
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<CustomFilter> customFilter() {
FilterRegistrationBean<CustomFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new CustomFilter());
registration.addUrlPatterns("/*"); // 拦截所有请求
return registration;
}
}
```
#### 拦截器(Interceptor)的执行时机
拦截器则是Spring MVC框架提供的功能,它基于HandlerInterceptor接口实现,仅对Spring MVC管理的资源有效。这意味着只有那些通过Controller处理的请求才会被拦截器所捕获。拦截器可以在Controller方法调用前、后以及视图渲染完成后执行特定逻辑,适合做权限验证、操作日志等业务相关的处理[^2]。
```java
// 示例:创建并注册自定义拦截器
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在Controller方法调用前执行
return true; // 返回true继续流程,false中断请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在Controller方法调用后执行
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求完成后的清理工作
}
}
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/**") // 拦截所有Spring MVC资源
.excludePathPatterns("/login", "/error");
}
}
```
#### 执行顺序分析
整个请求处理流程中,过滤器和拦截器的执行顺序如下:
- **请求到达时**:
- 首先触发的是Filter链中的`doFilterInternal()`方法。
- 接着进入DispatcherServlet,并由HandlerMapping找到对应的Controller。
- 在调用Controller方法之前,会依次执行所有配置好的Interceptor的`preHandle()`方法。
- 如果`preHandle()`返回true,则继续执行Controller;否则终止请求。
- **响应返回时**:
- Controller方法执行完毕后,`postHandle()`会被调用。
- 然后是ViewResolver解析视图并渲染模型数据。
- 最终,在整个请求结束时,`afterCompletion()`将被执行。
- 此外,Filter链中的后续部分也会在最后阶段运行,例如释放资源或修改响应头信息。
需要注意的是,如果在`preHandle()`中抛出异常或返回false,那么后续的Interceptor和Controller都不会被执行,但已经运行过的Filter仍然会在回程中被调用到其结束阶段的方法。同样地,若Controller内部发生异常,`postHandle()`不会被调用,而`afterCompletion()`依然会触发以确保资源能够正确释放[^3]。
综上所述,过滤器与拦截器虽然都能参与HTTP请求/响应周期,但它们各自有不同的职责边界和生命周期。理解它们之间的差异及协同工作机制对于构建高效稳定的Spring Boot应用程序至关重要。
阅读全文
相关推荐


















