过滤器和拦截器的执行顺序

优快云博客解析
在 Spring 框架中,过滤器Filter拦截器Interceptor)是两种不同的请求处理机制,它们分别作用于不同的层次,执行顺序也存在明显差异。 过滤器是 Java Servlet 规范的一部分,运行在 Servlet 容器级别,它会在请求进入 Spring MVC 框架之前就被触发。这意味着过滤器对所有进入应用的请求都有效,包括静态资源(如 HTML、CSS、JS 文件)其他非 Spring MVC 控制的资源。在请求到达 `DispatcherServlet` 之前,过滤器链会按照其在 `web.xml` 或 `FilterRegistrationBean` 中定义的顺序依次执行其 `doFilter` 方法[^1]。 拦截器则是 Spring MVC 框架提供的功能,它运行在 Spring 应用上下文中,作用范围仅限于被 Spring MVC 管理的请求。拦截器通过 `HandlerInterceptor` 接口定义,并在 `DispatcherServlet` 处理请求的过程中被调用。拦截器的 `preHandle` 方法会在目标控制器方法执行之前被调用,而 `postHandle` `afterCompletion` 方法则分别在控制器方法执行之后整个请求完成之后被调用[^2]。 因此,从整体流程来看,一个 HTTP 请求进入 Spring Boot 应用时,其处理流程大致如下: 1. 请求首先经过所有配置的过滤器Filter),按照定义顺序依次执行。 2. 请求进入 `DispatcherServlet`,随后被拦截器Interceptor)按照配置顺序拦截。 3. 拦截器的 `preHandle` 方法执行完毕后,控制器方法被调用。 4. 控制器方法执行完成后,拦截器的 `postHandle` 方法被调用。 5. 最后,响应生成并返回给客户端,拦截器的 `afterCompletion` 方法被执行[^3]。 这种设计使得过滤器适合用于处理与业务逻辑无关的通用任务,如日志记录、编码转换、跨域处理等;而拦截器则更适合用于处理与 Spring MVC 控制器方法相关的逻辑,如权限验证、参数绑定、视图模型处理等[^4]。 ### 示例代码 以下是一个简单的过滤器实现: ```java public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Before filter"); chain.doFilter(request, response); System.out.println("After filter"); } } ``` 注册过滤器: ```java @Bean public FilterRegistrationBean<MyFilter> myFilterRegistration() { FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new MyFilter()); registration.addUrlPatterns("/*"); return registration; } ``` 以下是拦截器的实现: ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Before interceptor"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("After interceptor"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("Completion interceptor"); } } ``` 注册拦截器: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值