返回顶部
分享到

spring中Interceptor的使用

java 来源:互联网 作者:佚名 发布时间:2025-12-14 21:44:39 人浏览
摘要

一、Interceptor 的核心概念 Interceptor(拦截器) 是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑。其核心作用包括: 预处理:在控制器方法执行前进行权限校验、日志记

一、Interceptor 的核心概念

Interceptor(拦截器) 是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑。其核心作用包括:

  • 预处理:在控制器方法执行前进行权限校验、日志记录等。
  • 后处理:在控制器方法执行后修改响应数据或记录结果。
  • 资源清理:在整个请求完成后释放资源或处理异常。

与 Filter 的区别:

特性 Interceptor(拦截器) Filter(过滤器)
作用范围 针对 Spring MVC 的控制器层 作用于 Servlet 容器层面
依赖框架 Spring MVC 管理 Servlet 原生规范
数据访问 可操作 ModelAndView 仅能操作 HttpServletRequest/Response。

二、Interceptor 的创建与配置

  1. 实现拦截器类
    继承 HandlerInterceptor 接口,重写以下方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class AuthInterceptor implements HandlerInterceptor {

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

        // 请求前处理(如权限校验)

        return true; // 返回 false 中断请求

    }

 

    @Override

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

        // 控制器执行后、视图渲染前处理(如修改 Model 数据)

    }

 

    @Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        // 请求完成后处理(如资源清理)

    }

}

  1. 注册拦截器
    通过 WebMvcConfigurer 的 addInterceptors 方法配置:

1

2

3

4

5

6

7

8

9

@Configuration

public class WebConfig implements WebMvcConfigurer {

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new AuthInterceptor())

                .addPathPatterns("/api/**")     // 拦截路径

                .excludePathPatterns("/login"); // 排除路径

    }

}

  • 路径匹配规则:支持 Ant 风格(如 /user/* 匹配单层路径,/admin/** 匹配多级路径)。
  • 多拦截器顺序:通过 Order 注解或实现 Ordered 接口控制优先级,值越小优先级越高。

三、拦截器的执行顺序

假设注册了 Interceptor1 和 Interceptor2:

  1. preHandle 方法:按注册顺序执行(Interceptor1 → Interceptor2)。
  2. postHandle 方法:按注册逆序执行(Interceptor2 → Interceptor1)。
  3. afterCompletion 方法:按注册逆序执行(Interceptor2 → Interceptor1)。

中断场景:若某一拦截器的 preHandle 返回 false,后续拦截器和控制器均不执行,但已通过 preHandle 的拦截器的 afterCompletion 仍会执行。

四、典型应用场景

  1. 权限校验
    在 preHandle 中检查用户登录状态或角色权限,拒绝非法请求。

    1

    2

    3

    4

    if (request.getSession().getAttribute("user") == null) {

        response.sendRedirect("/login");

        return false;

    }

  2. 日志记录
    记录请求路径、参数、耗时等信息:

    1

    2

    3

    long startTime = System.currentTimeMillis();

    request.setAttribute("startTime", startTime);

    // 在 afterCompletion 中计算耗时

  3. 性能监控
    统计接口响应时间,优化慢请求。

  4. 数据预处理
    在 postHandle 中统一添加响应头或加密敏感数据。

五、注意事项与最佳实践

性能优化

  • 避免在拦截器中执行耗时操作(如远程调用)。
  • 合理设置拦截路径,减少不必要的拦截。

常见问题排查

  • 拦截器未生效:检查路径匹配规则、是否注册到 Spring 容器。
  • 顺序混乱:通过 @Order 明确优先级。

与 AOP 结合

  • 拦截器适用于请求生命周期中的横切逻辑,而 AOP 更适用于方法级别的切面(如事务管理)。

六、完整示例

  1. 日志拦截器

1

2

3

4

5

6

7

8

9

10

11

12

public class LogInterceptor implements HandlerInterceptor {

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

        System.out.println("请求开始: " + request.getRequestURI());

        return true;

    }

 

    @Override

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

        System.out.println("请求完成: " + request.getRequestURI());

    }

}

  1. 配置类

1

2

3

4

5

6

7

8

9

10

@Configuration

public class WebConfig implements WebMvcConfigurer {

    @Override

    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");

        registry.addInterceptor(new AuthInterceptor())

                .addPathPatterns("/admin/**")

                .order(1); // 高优先级

    }

}

总结

Spring Interceptor 是处理请求生命周期横切逻辑的利器,通过灵活配置路径和优先级,可实现权限控制、日志记录等通用功能。结合 preHandle、postHandle 和 afterCompletion 的分阶段处理,能有效提升代码复用性和可维护性。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计