温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Interceptor能实现哪些功能

发布时间:2026-01-06 09:09:07 来源:亿速云 阅读:87 作者:小樊 栏目:编程语言

Java Interceptor能实现的功能

一 核心能力与执行阶段

  • Spring MVC中,拦截器基于HandlerInterceptor接口,围绕请求生命周期提供三个阶段的能力:
    • preHandle:在控制器方法执行前调用;返回true放行、返回false中断后续处理(可在此做登录校验、权限拦截、限流等)。
    • postHandle:在控制器方法执行之后、视图渲染之前调用;可读取/修改ModelAndView,补充公共模型数据、统一包装响应结构等。
    • afterCompletion:在请求完全结束后调用;适合做资源清理、记录执行耗时、统一异常处理与告警等(可获取抛出的异常)。
  • 多个拦截器组成拦截器链:preHandle 按配置顺序执行;若全部返回 true,则 postHandle、afterCompletion 按逆序执行;若某个 preHandle 返回 false,则其前面的拦截器的 afterCompletion 仍会执行。

二 典型应用场景

  • 身份认证与访问控制:在 preHandle 校验会话/令牌,未通过则重定向到登录或返回 403
  • 权限校验与细粒度授权:基于角色/资源/租户策略在 preHandle 拒绝越权访问。
  • 请求日志与审计:记录URI、参数、Header、处理时长、状态码等,用于排障与合规审计。
  • 性能监控与链路追踪:在 preHandle 记录开始时间,在 afterCompletion 计算耗时并上报指标/日志。
  • 统一异常处理与响应包装:在 afterCompletion 捕获异常,统一转换为标准错误结构返回给前端。
  • 国际化与上下文准备:在 preHandle 解析语言/时区放入上下文,供后续业务使用。
  • 业务前置/后置处理:如租户上下文注入、参数预处理、结果后置加工等可复用横切逻辑。

三 与其他组件的边界

  • Servlet Filter的区别与适用边界:
    • 拦截器更贴近业务方法调用(如 Spring MVC 控制器),可访问HandlerModelAndView与 Spring 上下文;Filter 工作在Servlet 容器层,面向所有请求,更偏底层(如编解码、压缩、XSS 过滤等)。
    • 拦截器通常基于反射/动态代理实现;Filter 基于函数回调
    • 拦截器可多次参与请求生命周期;Filter 一般在容器初始化阶段完成配置。
    • 选型建议:涉及业务语义的横切逻辑优先用拦截器;与协议/容器层面相关的处理优先用 Filter。

四 快速上手示例

  • 定义一个拦截器(记录耗时与日志):
@Component
public class LoggingInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        request.setAttribute("startTime", System.currentTimeMillis());
        return true; // 放行
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        long duration = System.currentTimeMillis() - (Long) request.getAttribute("startTime");
        System.out.printf("URI=%s, status=%d, duration=%dms%n",
                request.getRequestURI(), response.getStatus(), duration);
    }
}
  • 注册拦截器并配置路径匹配:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private LoggingInterceptor loggingInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loggingInterceptor)
                .addPathPatterns("/**")           // 拦截所有
                .excludePathPatterns("/static/**"); // 排除静态资源
    }
}
  • 提示:preHandle 返回 false 可中断调用链;多个拦截器的执行顺序可通过注册顺序与 order 控制。
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI