网站源码,智慧团建网站登录密码是啥,成都网络营销搜索推广优势,最好看的直播免费的Spring Boot拦截器#xff08;Interceptor#xff09;与过滤器#xff08;Filter#xff09;详细教程 目录
概述 什么是拦截器#xff08;Interceptor#xff09;#xff1f;什么是过滤器#xff08;Filter#xff09;#xff1f;两者的核心区别 使用场景 拦截器的典…Spring Boot拦截器Interceptor与过滤器Filter详细教程 目录
概述 什么是拦截器Interceptor什么是过滤器Filter两者的核心区别 使用场景 拦截器的典型应用过滤器的典型应用 实现步骤 拦截器的创建与配置过滤器的创建与配置 代码示例 自定义拦截器自定义过滤器 执行顺序与流程 过滤器、拦截器、Controller的执行顺序可视化流程图 常见问题与解决方案总结 1. 概述
1.1 什么是拦截器Interceptor
拦截器是 Spring MVC 框架的组件基于 AOP面向切面编程 实现。它允许在请求处理的不同阶段如Controller方法执行前后插入自定义逻辑。
1.2 什么是过滤器Filter
过滤器是 Java Servlet规范 定义的组件作用于所有进入容器的请求如Tomcat。它可以在请求到达Servlet前或响应返回客户端前进行预处理和后处理。
1.3 核心区别
特性拦截器Interceptor过滤器Filter所属框架Spring MVCServlet API作用范围仅Spring MVC管理的请求所有请求包括静态资源依赖依赖Spring容器依赖Servlet容器如Tomcat执行时机Controller方法前后Servlet处理前后获取Bean支持通过Spring上下文不支持需通过其他方式注入 2. 使用场景
2.1 拦截器的典型应用
日志记录记录请求参数、响应时间。权限验证检查用户是否登录或拥有权限。事务管理在Controller方法前后开启/提交事务。性能监控统计接口耗时。
2.2 过滤器的典型应用
全局字符编码统一设置请求/响应的编码如UTF-8。跨域处理添加CORS响应头。XSS防御过滤请求参数中的恶意脚本。请求压缩对响应内容进行GZIP压缩。 3. 实现步骤
3.1 创建拦截器
步骤
实现 HandlerInterceptor 接口重写以下方法 preHandle()在Controller方法执行前调用。postHandle()在Controller方法执行后、视图渲染前调用。afterCompletion()在请求完成后调用视图渲染后。 注册拦截器到Spring MVC配置。
代码示例
public class AuthInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 检查用户是否登录if (request.getSession().getAttribute(user) null) {response.sendRedirect(/login);return false; // 中断请求}return true;}
}注册拦截器
Configuration
public class WebMvcConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new AuthInterceptor()).addPathPatterns(/**).excludePathPatterns(/login, /static/**);}
}注册多个拦截器
Configuration
public class WebMvcConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {// 第一个拦截器日志优先级高registry.addInterceptor(new LogInterceptor()).addPathPatterns(/**) // 拦截所有路径.excludePathPatterns(/static/**); // 排除静态资源// 第二个拦截器权限优先级低registry.addInterceptor(new AuthInterceptor()).addPathPatterns(/api/**); // 仅拦截/api路径}
}
关键配置选项
配置方法说明addPathPatterns(/api)指定拦截的路径支持Ant风格excludePathPatterns(/login)排除特定路径order(1)显式设置顺序默认按注册顺序
若要手动指定顺序可添加
registry.addInterceptor(new LogInterceptor()).order(1);
registry.addInterceptor(new AuthInterceptor()).order(2);3.2 创建过滤器
步骤
实现 javax.servlet.Filter 接口重写 doFilter 方法。注册过滤器到Servlet容器通过注解或配置类。
代码示例
WebFilter(urlPatterns /*)
public class LoggingFilter implements Filter {Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println(请求开始: ((HttpServletRequest) request).getRequestURI());chain.doFilter(request, response); // 继续执行后续过滤器或ServletSystem.out.println(请求结束);}
}注册过滤器若未使用WebFilter
Configuration
public class FilterConfig {Beanpublic FilterRegistrationBeanLoggingFilter loggingFilter() {FilterRegistrationBeanLoggingFilter bean new FilterRegistrationBean();bean.setFilter(new LoggingFilter());bean.addUrlPatterns(/*);bean.setOrder(1); // 设置执行顺序return bean;}
}注意 确保主类添加 ServletComponentScan 以启用 WebFilter 注解。 4. 执行顺序与流程
4.1 执行顺序
过滤器FilterChain → 2. 拦截器preHandle → 3. Controller方法 → 4. 拦截器postHandle → 5. 视图渲染 → 6. 拦截器afterCompletion → 7. 过滤器后续处理
4.2 流程图
客户端 → Filter.doFilter() → Interceptor.preHandle()→ Controller → Interceptor.postHandle()→ 视图渲染 → Interceptor.afterCompletion()→ Filter.doFilter()后续处理 → 客户端5. 常见问题与解决方案
Q1如何控制多个拦截器/过滤器的执行顺序
拦截器通过 registry.addInterceptor() 的顺序决定。过滤器通过 FilterRegistrationBean.setOrder() 设置优先级值越小越先执行。
Q2拦截器中如何获取Spring管理的Bean
直接从Spring容器注入
public class AuthInterceptor implements HandlerInterceptor {Autowiredprivate UserService userService; // 直接注入
}Q3过滤器中如何修改请求参数
通过自定义 HttpServletRequestWrapper
public class ModifyRequestWrapper extends HttpServletRequestWrapper {// 重写getParameter等方法以修改参数
}// 在Filter中替换Request对象
chain.doFilter(new ModifyRequestWrapper(request), response);Q4拦截器和过滤器执行时出现异常如何处理
拦截器在 afterCompletion 中处理异常。过滤器使用 try-catch 包裹 chain.doFilter()。
Q5如何让某个拦截器全局生效
使用 addPathPatterns(/**)
registry.addInterceptor(new LogInterceptor()).addPathPatterns(/**);Q6如何跳过特定拦截器的执行
在 preHandle 中返回 false
Override
public boolean preHandle(...) {if (跳过条件) {return false; // 后续拦截器和Controller不会执行}return true;
}Q7拦截器之间如何共享数据
通过 request.setAttribute 传递
// 在第一个拦截器中存储数据
request.setAttribute(key, value);// 在后续拦截器中获取
String value (String) request.getAttribute(key);6. 总结 选择拦截器还是过滤器 需要访问Spring上下文或Controller信息 → 拦截器。需处理所有请求包括静态资源 → 过滤器。 最佳实践 优先使用拦截器处理业务相关逻辑。使用过滤器处理底层Servlet容器的任务如编码、压缩。