HandlerInterceptor 与 WebMvcConfigurer

是Spring框架中的两个接口,用于在Spring MVC应用中实现控制器请求的拦截和配置

## HandlerInterceptor 

接口用于定义拦截器,可以对HTTP请求进行预处理和后处理,这些拦截器通过实现下面三个方法来工作:

1. **`preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)`**:
   - 在请求处理之前调用。
   - 例如:权限校验
   - 返回`true`继续处理请求,返回`false`中止请求。
2. **`postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)`**:
   - 在控制器方法调用之后、视图渲染之前调用。
   - 可用于修改`ModelAndView`。
3. **`afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)`**:
   - 在整个请求完成后调用。
   - 适用于资源清理工作。

`HandlerInterceptor`通常用于记录日志、权限检查或性能监控等场景。

## WebMvcConfigurer

该接口用于配置Spring MVC的一些新特性,它提供了很多默认方法,开发这可以选择实现这些方法来配置mVC框架。例如:

- **`addInterceptors(InterceptorRegistry registry)`**:
  - 添加`HandlerInterceptor`实现到Spring MVC。
  - 在这个方法中,可以通过`registry.addInterceptor(new MyInterceptor())`将自定义的拦截器添加到MVC配置中。
- **`configureMessageConverters(List<HttpMessageConverter<?>> converters)`**:
  - 配置消息转换器,用于将请求或响应转换为相应的Java对象或数据格式。
- **`addViewControllers(ViewControllerRegistry registry)`**:
  - 为一个简单的请求路径配置视图,不需要定义一个控制器。
- **`addResourceHandlers(ResourceHandlerRegistry registry)`**:
  - 配置静态资源处理,例如CSS、JS文件等等。

## 两者配合使用

要在Spring MVC项目中使用`HandlerInterceptor`和`WebMvcConfigurer`,通常需要做以下步骤:

1. **创建一个拦截器类**:

   - 实现`HandlerInterceptor`接口,重写其方法以定义拦截行为。

2. **实现`WebMvcConfigurer`接口**:

   - 创建一个配置类,重写`addInterceptors`方法,将拦截器注册到Spring MVC。

     ```java
     @Component
     public class MyInterceptor implements HandlerInterceptor {
         @Override
         public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
             // 预处理逻辑
             return true;
         }
     
         @Override
         public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
             // 后处理逻辑
         }
     
         @Override
         public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
             // 请求完成后处理
         }
     }
     
     @Component
     public class WebConfig implements WebMvcConfigurer {
         @Override
         public void addInterceptors(InterceptorRegistry registry) {
             registry.addInterceptor(new MyInterceptor());
         }
     }
     ```


posted @ 2025-05-18 16:34  小郑[努力版]  阅读(25)  评论(0)    收藏  举报