Interceptor拦截器
介绍:
Spring 拦截器(Interceptor)是 Spring MVC 框架中的核心组件,用于在请求处理的预处理、后处理和完成后三个阶段插入自定义逻辑,实现请求过滤、权限校验、日志记录、性能监控等横切关注点(Cross-Cutting Concerns)。
与Filter的区别
| 特性 | 拦截器 (Interceptor) | 过滤器 (Filter) |
|---|---|---|
| 所属框架 | Spring MVC | Servlet 规范 |
| 作用范围 | 仅 Spring MVC 处理的请求(DispatcherServlet 之后) | 所有 Web 请求(包括静态资源、非 Spring 处理的请求) |
| 执行时机 | 在 HandlerMethod 执行前后、视图渲染前后 | 在请求进入 Servlet 容器后、DispatcherServlet 之前 |
使用方法
核心接口
public interface HandlerInterceptor {
//先进行此方法,返回True才进行对应controller方法
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
//执行完controller后执行此方法
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
//视图渲染完成执行此方法
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
实现类
public class LogInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//拦截器时进行的操作
return true;
}
// 后处理:可修改视图模型
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//可返回一些内容给视图
}
// 完成后处理:记录请求耗时
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 获取请求开始时间,计算耗时
long startTime = (long) request.getAttribute("startTime");
long costTime = System.currentTimeMillis() - startTime;
// 记录响应状态码和耗时
int status = response.getStatus();
logger.info("请求完成:状态码{},耗时{}ms", status, costTime);
// 若有异常,记录异常信息
if (ex != null) {
logger.error("请求处理异常", ex);
}
}
}
注册拦截器到 Spring 容器
@Configuration // 标记为配置类,Spring 启动时自动扫描
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 注册自定义拦截器
* @param registry 拦截器注册器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册日志拦截器(也可通过依赖注入)
registry.addInterceptor(new LogInterceptor())//进行此拦截器里的内容
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/static/**", "/error"); //不做拦截的路径
// 可注册多个拦截器(执行顺序与注册顺序一致)
// registry.addInterceptor(new AuthInterceptor())
// .addPathPatterns("/api/**") // 仅拦截 /api/ 下的请求
// .excludePathPatterns("/api/login"); // 排除登录接口
}
}
Spring拦截器详解
1440

被折叠的 条评论
为什么被折叠?



