Spring 面试题
目录

Spring MVC 中如何使用拦截器 (Interceptor)?

· 约 6 分钟读完 · 第 74 / 130 章

推荐答案

在 Spring MVC 中,拦截器(Interceptor)可以通过实现 HandlerInterceptor 接口或继承 HandlerInterceptorAdapter 类来创建。拦截器允许你在请求处理之前、之后以及视图渲染之后执行自定义逻辑。

实现步骤

  1. 创建拦截器类
    创建一个类并实现 HandlerInterceptor 接口或继承 HandlerInterceptorAdapter 类。通常需要重写以下方法:

    • preHandle():在请求处理之前执行。
    • postHandle():在请求处理之后、视图渲染之前执行。
    • afterCompletion():在视图渲染之后执行。
  2. 注册拦截器
    在 Spring MVC 配置类中,通过重写 addInterceptors() 方法来注册拦截器,并指定拦截的路径。

  3. 配置拦截器顺序
    如果需要多个拦截器,可以通过 order() 方法设置拦截器的执行顺序。


本题详细解读

拦截器的作用

拦截器是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑。它可以用于以下场景:

  • 权限验证:在 preHandle() 中检查用户权限。
  • 日志记录:在 afterCompletion() 中记录请求处理时间。
  • 数据预处理:在 postHandle() 中对模型数据进行修改。

拦截器与过滤器的区别

  • 拦截器:基于 Spring MVC 框架,只能拦截 Spring MVC 处理的请求。
  • 过滤器:基于 Servlet 规范,可以拦截所有请求(包括静态资源)。

拦截器的执行流程

  1. preHandle():在 Controller 方法执行之前调用。如果返回 false,请求将被中断。
  2. postHandle():在 Controller 方法执行之后、视图渲染之前调用。
  3. afterCompletion():在视图渲染之后调用,通常用于资源清理。

拦截器的配置

  • 路径匹配:通过 addPathPatterns() 和 excludePathPatterns() 方法指定拦截路径。
  • 顺序控制:通过 order() 方法设置多个拦截器的执行顺序。

注意事项

  • 拦截器的 preHandle() 方法必须返回 true,否则请求将被中断。
  • 拦截器的 postHandle() 方法在异步请求中不会执行。
  • 拦截器的 afterCompletion() 方法在请求完成后一定会执行,即使发生异常。

通过合理使用拦截器,可以有效地增强 Spring MVC 应用的功能性和灵活性。