对Spring拦截器详细讲解

HandlerInterceptor 的用法

HandlerInterceptor 是在 Java 的 Spring 框架中的一个接口,它用于拦截 Spring MVC 请求的处理。当一个请求到达 DispatcherServlet 并且确定了要调用的 Controller 和相应的Handler 方法之后,但请求真正到达这个 Handler 方法之前, HandlerInterceptor 允许你插入一些自定义的代码。
通过实现 HandlerInterceptor 接口,你可以创建自己的拦截器来:

  • 在请求处理之前执行某些操作(比如权限检查)。
  • 在请求处理之后,但在渲染视图之前执行某些操作(比如添加额外的模型数据)。
  • 在请求处理完成并且视图渲染之后执行某些操作(比如日志记录)。
    HandlerInterceptor 接口定义了三个方法:
  1. preHandle : 在请求处理之前调用(例如,Controller 方法调用之前)。
  2. postHandle : 在请求处理之后,但在渲染视图之前调用。
  3. afterCompletion : 在整个请求结束之后调用,即在视图渲染之后。
    通过实现这些方法,你可以对请求-响应的整个流程进行细粒度的控制。
    以下是如何实现一个简单的 HandlerInterceptor 的例子:
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) {
        // 请求处理前逻辑
        return true; // 返回 true 继续流程,返回 false 则中断
    }
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler, ModelAndView modelAndView)
    {
        // 请求处理后,视图渲染前逻辑
    }
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex) {
        // 视图渲染后逻辑
    }
}

要使拦截器生效,你需要在 Spring MVC 的配置中注册这个拦截器。在使用 Java 配置的情况下,你可以通过实现 WebMvcConfigurer 接口的 addInterceptors 方法来完成注册。
这是一个配置拦截器的例子:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**"); // 指定拦截器的作用路径
    }
}

通过这种方式,你可以利用 HandlerInterceptor 对请求进行拦截处理,实现各种自定义的需求。

WebMvcConfigurer 接口

WebMvcConfigurer 是 Spring Framework 5 中引入的一个接口,用于配置 Spring MVC 的各种设置。它提供了一种基于 Java 的配置方式,让你可以自定义 Spring MVC 的行为,而不必使用 XML 配置文件。
通过实现 WebMvcConfigurer 接口,你可以覆盖其中的方法来定制以下方面的配置:

  • 添加或自定义 Converter 、Formatter 和 HttpMessageConverter
  • 注册 Interceptor 、ControllerAdvice 和其他 MVC 组件
  • 配置跨域处理(CORS)
  • 设置路径匹配和内容协商的策略
  • 自定义 ViewResolver 和 ViewController
  • 配置静态资源处理(如图片、CSS、JS文件等)
    下面是一个简单的例子,展示了如何实现 WebMvcConfigurer 来添加一个拦截器:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyHandlerInterceptor())
                .addPathPatterns("/**"); // 添加拦截器并设置拦截路径
    }
    // 你还可以覆盖其他方法来定制其他 MVC 配置
}

在这个例子中,我们通过覆盖 addInterceptors 方法来注册一个自定义的拦截器 MyHandlerInterceptor ,该拦截器将拦截所有的请求(由 “/**” 路径模式指定)。
WebMvcConfigurer 的主要优点是它提供了一种集中化的、声明式的方式来配置 Spring MVC,这有助于保持代码的组织性,并且更容易测试和维护。此外,它还允许你充分利用 Java 8 的 lambda 表达式来简化配置代码。
在 Spring Boot 应用程序中,通常会有一个自动配置的 WebMvcConfigurer ,但你可以通过创建自己的 @Configuration 类并实现 WebMvcConfigurer 接口来覆盖默认配置或添加额外的配置。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值