是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());
}
}
```