什么是拦截器?什么是过滤器?
深度解析拦截器与过滤器区别、原理与实战应用在 Java Web 开发中过滤器Filter和拦截器Interceptor是两种常用的请求处理组件。本文将系统梳理两者的区别、底层依赖框架、自定义实现方式并结合流程图与 UML 时序图掌握这两个核心组件。一、过滤器Filter—— Servlet 规范的原生组件1.1 什么是过滤器过滤器是Java Servlet 规范中定义的一种组件它运行在Web 容器如 Tomcat、Jetty内部。过滤器可以对所有进入 Web 应用的请求进行预处理也可以对响应进行后处理。它能够拦截的资源非常广泛静态资源HTML、CSS、JS、图片、动态资源Servlet、JSP以及转发请求等。1.2 过滤器基于什么框架过滤器基于 Java Servlet API属于 Java EE / Jakarta EE 规范与任何 MVC 框架无关。只要你的项目运行在支持 Servlet 规范的 Web 容器中就可以使用过滤器。二、拦截器Interceptor—— Spring MVC 的专属利器2.1 什么是拦截器拦截器是Spring MVC 框架提供的一种组件它运行在 Spring 容器管理的环境中。拦截器只能拦截 Controller 层的方法调用即RequestMapping或GetMapping等注解标注的方法无法直接拦截静态资源除非额外配置。2.2 拦截器基于什么框架拦截器基于 Spring MVC 框架底层利用了 Spring AOP 思想但具体实现是通过HandlerInterceptor接口和DispatcherServlet的调用链完成的。三、过滤器 vs 拦截器核心区别对比维度过滤器Filter拦截器Interceptor规范来源Java Servlet 规范Spring MVC 框架依赖容器需要 Web 容器Tomcat、Jetty 等不直接依赖 Web 容器但需要 Spring 环境拦截范围几乎一切资源静态、动态、转发等仅 Controller 层的请求映射方法执行时机请求进入 Web 容器后到达 Servlet 之前请求到达 Controller 之前 / 之后 / 视图渲染之后是否可访问 Spring 特性否不能直接使用Autowired但可通过特殊方式获取 Bean是完全受 Spring 管理可任意注入 Bean典型用途编码过滤、请求日志、压缩、XSS 防护权限校验、Token 验证、日志记录、性能监控 简单记忆Filter 是 Web 容器的“门卫”拦截器是 Spring MVC 的“安检员”。四、请求处理流程图解下面用 Mermaid 流程图展示一次请求分别经过 Filter 和 Interceptor 的完整路径客户端请求Web容器过滤器1过滤器2DispatcherServlet拦截器1 preHandle拦截器2 preHandleController 处理拦截器2 postHandle拦截器1 postHandle视图渲染拦截器2 afterCompletion拦截器1 afterCompletion过滤器2 响应后处理过滤器1 响应后处理执行顺序说明请求阶段Filter → DispatcherServlet → Interceptor.preHandle → Controller响应阶段Controller → Interceptor.postHandle → 视图渲染 → Interceptor.afterCompletion → Filter五、自定义拦截器Interceptor实战5.1 实现HandlerInterceptor接口importorg.springframework.web.servlet.HandlerInterceptor;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassAuthInterceptorimplementsHandlerInterceptor{// 在 Controller 方法执行之前调用OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println(preHandle: 请求到达 Controller 之前);// 返回 true 表示放行false 表示拦截Stringtokenrequest.getHeader(Authorization);if(tokennull||token.isEmpty()){response.setStatus(401);returnfalse;}returntrue;}// 在 Controller 方法执行之后视图渲染之前调用OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println(postHandle: Controller 执行完毕视图尚未渲染);}// 在整个请求结束之后视图渲染完成调用通常用于资源清理OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println(afterCompletion: 请求处理完毕视图已渲染);}}5.2 配置拦截规则Spring Boot 方式importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newAuthInterceptor()).addPathPatterns(/api/**)// 拦截 /api/ 下的所有请求.excludePathPatterns(/api/login,/api/register);// 放行登录注册}}六、拦截器的三大执行时机UML 时序图ViewControllerInterceptorDispatcherServletClientViewControllerInterceptorDispatcherServletClientalt[preHandle 返回 true][preHandle 返回 false]发起请求preHandle()调用方法返回 ModelAndViewpostHandle()渲染视图响应内容afterCompletion()返回响应拦截请求直接返回如 401核心总结preHandle最常用用于权限、Token、黑名单校验。postHandle可修改ModelAndView添加公共数据。afterCompletion无论是否发生异常都会执行适合日志记录、资源释放。七、过滤器快速示例基于 Servlet API虽然本文重点在拦截器但为了对比给出一个简单过滤器示例importjavax.servlet.*;importjavax.servlet.http.HttpServletRequest;importjava.io.IOException;publicclassLogFilterimplementsFilter{OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq(HttpServletRequest)request;System.out.println(Filter 拦截到请求req.getRequestURI());chain.doFilter(request,response);// 放行System.out.println(Filter 响应后处理);}}在web.xml或WebFilter中配置即可。八、拦截器典型应用场景场景实现思路权限拦截preHandle中检查用户角色或权限标识无权限返回 403Token 验证从 Header 或 Cookie 中获取 JWT Token验证合法性黑名单机制将禁用 Token 或 IP 存入 Redis在preHandle中校验请求日志preHandle记录开始时间afterCompletion计算耗时接口幂等性基于 Token 或参数生成唯一 Key在preHandle中防重复提交九、过滤器与拦截器如何选择需要全局、无差别地处理所有资源包括静态文件→ 选Filter只关注业务接口Controller 层且需要访问 Spring 容器中的 Bean→ 选Interceptor同时使用过滤器负责通用请求预处理如字符编码、跨域拦截器负责具体业务鉴权。十、总结过滤器基于 Servlet 规范依赖 Web 容器拦截范围广适合粗粒度的全局处理。拦截器基于 Spring MVC依赖 Spring 环境仅拦截 Controller适合细粒度的业务逻辑校验。两者的核心区别在于拦截粒度和框架依赖合理组合使用可以构建清晰高效的请求处理链路。 推荐阅读Spring MVC 官方文档 - InterceptorJava Servlet Specification - Filters
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2504736.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!