功能
- 在请求处理过程的不同阶段进行拦截和处理
使用
- 创建拦截器:实现
HandlerInterceptor
接口,需要重写三个方法preHandle
:在请求处理之前执行,返回true
表示继续处理,false
表示请求被拦截preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
postHandle
:在请求处理之后,视图渲染之前执行postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
afterCompletion
:在请求处理完成之后执行,用于资源清理等操作afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
@Component
public class MyInterceptor implements HandlerInterceptor {
// 请求处理前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle: Request is being processed");
// 返回 true 表示继续请求处理,返回 false 表示拦截请求
return true;
}
// 请求处理后,视图渲染前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle: Request processed");
}
// 请求完成后,响应返回前
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion: Request completed");
}
}
- 注册拦截器:实现
WebMvcConfigurer
接口并重写addInterceptors
方法来注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private final MyInterceptor myInterceptor; // 上面创建的拦截器实例
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册拦截器并指定拦截的路径
registry.addInterceptor(myInterceptor)
.addPathPatterns("/api/**") // 拦截路径
.excludePathPatterns("/api/login", "/api/register"); // 排除路径
}
}
拦截器和过滤器区别
特性 | 拦截器 | 过滤器 |
---|---|---|
所属框架 | Spring MVC | Servlet |
作用范围 | 仅在 Spring MVC 请求处理流程中起作用 | 在所有的 HTTP 请求中起作用 |
功能 | 控制器的请求处理、视图渲染等流程控制 | 请求和响应的通用预处理和后处理 |
配置方式 | 通过 WebMvcConfigurer 配置 | 通过 FilterRegistrationBean 配置 |
可以访问的对象 | Handler (控制器方法)、ModelAndView 、HttpServletRequest 、HttpServletResponse | 只能访问 HttpServletRequest 和 HttpServletResponse |
典型用途 | 权限验证、日志记录、请求处理流程控制等 | 日志记录、性能监控、跨域处理、安全检查等 |
执行顺序 | 拦截器是在 Spring MVC 控制器方法执行前和执行后进行处理,拦截器链顺序按照配置顺序执行 | 过滤器链中的过滤器按注册顺序执行,并且在 Servlet 或 JSP 调用前执行 |
Last updated on