Spring Boot拦截器(Interceptor)的概念
- 在Spring Boot中,拦截器是一种AOP的实现方式。它主要用于<font style="color:#DF2A3F;">拦截请求</font>,在请求处理之前和之后执行特定的代码逻辑。与过滤器不同的是,拦截器更侧重于对Spring MVC中的<font style="color:#DF2A3F;">控制器(Controller)</font>进行拦截,能够访问到Spring MVC上下文中的对象,比如获取请求的处理器(Handler)信息、模型(Model)和视图(View)相关信息等。
创建拦截器类
- 要创建拦截器,需要实现`HandlerInterceptor`接口。这个接口有三个方法:
* `<font style="color:#DF2A3F;">preHandle()</font>`:在请求处理之前调用。可以进行权限验证、日志记录等操作。如果返回`false`,则请求被中断,不会继续执行后续的处理器(Controller)方法;如果返回`true`,则请求继续传递。
* `<font style="color:#DF2A3F;">postHandle()</font>`:在请求处理之后,视图渲染之前调用。可以对模型(Model)和视图(View)进行修改等操作。
* `<font style="color:#DF2A3F;">afterCompletion()</font>`:在整个请求完成后(包括视图渲染后)调用。主要用于资源清理等操作。
- 例如,创建一个简单的拦截器来记录请求处理时间:RequestTimeInterceptor对象
public class RequestTimeInterceptor implements HandlerInterceptor {
private Date startTime;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
startTime = new Date();
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
Date endTime = new Date();
System.out.println("Request processing time: " + (endTime.getTime() - startTime.getTime()) + "ms");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 可以在这里进行资源清理等操作
}
}
配置拦截器
方式一:通过实现WebMvcConfigurer接口
- 创建一个配置类,实现`WebMvcConfigurer`接口。
- 在`addInterceptors`方法中添加拦截器并配置拦截路径。
- 例如:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RequestTimeInterceptor()).addPathPatterns("/**");
}
}
上述代码中,addInterceptor方法添加了
RequestTimeInterceptor拦截器,
addPathPatterns方法指定了拦截的路径为所有路径(
/**`)。
-
方式二:通过扩展WebMvcConfigurationSupport类(不推荐,可能会覆盖Spring Boot的默认配置)
- 创建一个配置类,继承自
WebMvcConfigurationSupport
。 - 重写
addInterceptors
方法来配置拦截器。 - 例如:
public class Intercept
- 创建一个配置类,继承自