HandlerInterceptor 的用法
HandlerInterceptor 是在 Java 的 Spring 框架中的一个接口,它用于拦截 Spring MVC 请求的处理。当一个请求到达 DispatcherServlet 并且确定了要调用的 Controller 和相应的Handler 方法之后,但请求真正到达这个 Handler 方法之前, HandlerInterceptor 允许你插入一些自定义的代码。
通过实现 HandlerInterceptor 接口,你可以创建自己的拦截器来:
- 在请求处理之前执行某些操作(比如权限检查)。
- 在请求处理之后,但在渲染视图之前执行某些操作(比如添加额外的模型数据)。
- 在请求处理完成并且视图渲染之后执行某些操作(比如日志记录)。
HandlerInterceptor 接口定义了三个方法:
- preHandle : 在请求处理之前调用(例如,Controller 方法调用之前)。
- postHandle : 在请求处理之后,但在渲染视图之前调用。
- 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 接口来覆盖默认配置或添加额外的配置。