Java Web 拦截机制实战指南:Filter 与 Interceptor 深度解析
一、理解核心概念在 Java Web 开发中过滤器Filter和拦截器Interceptor是两种核心的请求处理机制。它们虽然都能对请求进行拦截和处理但定位截然不同Filter是 Servlet 容器的守门人位于应用最外层Interceptor是 Spring MVC 的执法官位于框架内部二、FilterServlet 容器的第一道防线2.1 本质与特点Filter 是Java Servlet 规范定义的组件由 Servlet 容器如 Tomcat直接管理不依赖任何框架因此具有最强的通用性。生命周期方法方法触发时机用途init()应用启动时初始化配置doFilter()每次请求核心处理逻辑destroy()应用关闭时资源释放执行流程请求 → Filter1 → Filter2 → Servlet/Controller → Filter2 → Filter1 → 响应2.2 Spring Boot 中的实现方式方式一注解方式适合简单场景WebFilter(urlPatterns /api/*, filterName authFilter) public class AuthFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 前置处理 System.out.println(认证检查开始); // 放行到下一个 Filter 或目标资源 chain.doFilter(request, response); // 后置处理响应返回时执行 System.out.println(认证检查结束); } } // 在主类开启扫描 SpringBootApplication ServletComponentScan public class Application { }方式二配置类方式推荐更灵活Configuration public class FilterConfig { Bean public FilterRegistrationBeanAuthFilter authFilter() { FilterRegistrationBeanAuthFilter bean new FilterRegistrationBean(); bean.setFilter(new AuthFilter()); bean.addUrlPatterns(/api/*); bean.setOrder(1); // 控制执行顺序数字越小越先执行 return bean; } }2.3 Filter 的典型应用场景场景说明统一编码设置 UTF-8 编码解决中文乱码安全防护XSS 过滤、SQL 注入检测跨域处理添加 CORS 响应头请求日志记录所有请求的 IP、路径、耗时数据压缩Gzip 压缩响应内容三、InterceptorSpring MVC 的精准拦截3.1 本质与特点Interceptor 是Spring MVC 框架提供的机制只能拦截被DispatcherServlet处理的请求即映射到 Controller 的请求。它可以获取 Spring 上下文与业务逻辑深度集成。三个核心拦截点方法执行时机能否终止请求典型用途preHandle()Controller 方法执行前可返回false终止登录验证、权限校验postHandle()Controller 执行后视图渲染前无法终止修改 Model、添加公共数据afterCompletion()请求处理完成含异常无法终止资源清理、异常日志3.2 完整实现示例Component public class PermissionInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取请求信息 String uri request.getRequestURI(); System.out.println(【拦截】请求路径: uri); // 权限校验逻辑 HttpSession session request.getSession(); if (session.getAttribute(user) null uri.startsWith(/admin)) { response.sendRedirect(/login); return false; // 拦截不继续执行 } return true; // 放行 } Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 向视图添加通用数据 if (modelAndView ! null) { modelAndView.addObject(serverTime, new Date()); } } Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 记录异常信息 if (ex ! null) { System.out.println(【异常】请求处理出错: ex.getMessage()); } // 清理 ThreadLocal 等资源 } }注册 InterceptorConfiguration public class WebMvcConfig implements WebMvcConfigurer { Autowired private PermissionInterceptor permissionInterceptor; Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(permissionInterceptor) .addPathPatterns(/admin/**, /user/**) // 拦截路径 .excludePathPatterns(/login, /public/**); // 排除路径 } }四、核心区别对比对比维度FilterInterceptor规范来源Servlet 规范J2EESpring MVC 框架框架依赖不依赖 Spring任何 Web 应用可用必须在 Spring 环境中使用拦截范围所有请求含静态资源、JSP仅 DispatcherServlet 映射的请求执行时机Servlet 之前Controller 前后方法数量1 个doFilter()3 个preHandle、postHandle、afterCompletion可获取对象ServletRequest、ServletResponseHttpServletRequest、HandlerMethod、ModelAndView异常处理只能捕获 Filter 内部异常afterCompletion可捕获 Controller 异常静态资源拦截支持默认不支持五、执行顺序详解当 Filter 和 Interceptor 同时存在时执行流程如下1. Filter.doFilter() 前置代码 ↓ 2. Interceptor.preHandle() ↓ 3. Controller 方法执行 ↓ 4. Interceptor.postHandle() ↓ 5. 视图渲染 ↓ 6. Interceptor.afterCompletion() ↓ 7. Filter.doFilter() 后置代码示意图请求进入 ↓ [Filter 1] ──┐ ↓ │ [Filter 2] │ 过滤器链双向拦截 ↓ │ [Servlet] │ ↓ │ [Interceptor 1.preHandle] ──┐ ↓ │ [Interceptor 2.preHandle] │ ↓ │ [Controller 执行] │ 拦截器链三阶段 ↓ │ [Interceptor 2.postHandle] │ ↓ │ [Interceptor 1.postHandle] │ ↓ │ [视图渲染] │ ↓ │ [Interceptor 1.afterCompletion]┘ ↓ [Interceptor 2.afterCompletion] ↓ [Filter 2 后置] ↓ [Filter 1 后置] ↓ 响应返回六、实战选择指南6.1 优先使用 Filter 的场景统一字符编码需要在请求进入 Servlet 前就设置编码跨域处理CORS处理OPTIONS预检请求早于 Spring MVC安全过滤XSS、SQL 注入的输入预处理全局日志记录所有 HTTP 请求的完整生命周期非 Spring 环境纯 Servlet 应用6.2 优先使用 Interceptor 的场景登录状态校验可便捷获取HttpSession和 Spring Bean细粒度权限控制结合PreAuthorize、Security 上下文性能监控精确统计 Controller 执行时间业务操作日志获取HandlerMethod知道调用了哪个方法视图数据增强在postHandle中向 Model 添加数据七、黄金组合实践在实际项目中两者配合使用才能发挥最大价值层级组件职责外层Filter编码设置、CORS、XSS 过滤、请求日志内层Interceptor登录验证、权限校验、性能监控、业务日志典型配置示例// Filter 处理通用底层逻辑 Bean public FilterRegistrationBeanCharacterEncodingFilter encodingFilter() { FilterRegistrationBeanCharacterEncodingFilter bean new FilterRegistrationBean(); bean.setFilter(new CharacterEncodingFilter(UTF-8, true)); bean.addUrlPatterns(/*); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 最先执行 return bean; } // Interceptor 处理业务逻辑 Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns(/api/**) .excludePathPatterns(/api/login); }八、面试高频问题Q1Filter 和 Interceptor 的本质区别是什么Filter 是 Servlet 规范由容器管理Interceptor 是 Spring MVC 机制由框架管理。Filter 更早执行能拦截所有请求Interceptor 更晚执行只能拦截 Spring MVC 请求但能获取更丰富的上下文。Q2如何让 Interceptor 拦截静态资源修改DispatcherServlet的url-pattern为/*但会带来性能开销通常不建议。静态资源拦截建议用 Filter。Q3afterCompletion一定会执行吗只要preHandle返回true并执行了无论后续是否异常afterCompletion都会执行适合资源清理。Q4如何控制多个 Filter 的执行顺序使用FilterRegistrationBean的setOrder()方法数字越小优先级越高。九、总结FilterInterceptor定位容器层护城河框架层城门守卫优势通用、底层、无框架依赖精细、灵活、可获取 Spring 上下文最佳实践处理通用、底层问题处理业务、安全、监控逻辑核心原则Filter 做通用处理Interceptor 做业务拦截两者协同构建完整的请求处理体系。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2424772.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!