Java中的拦截器(
Interceptor
)是一种设计模式,它允许在请求到达目标方法之前或之后执行一些操作。在Web应用中,拦截器常常用于实现诸如日志记录、权限检查、性能监控、事务管理等功能。
SpringBoot 拦截器是 AOP 的一种实现,专门拦截对控制层的请求,主要应用于判断用户权限,拦截
webSocket
请求。
拦截器的 主要作用
包括以下三种,其实也就是对应 HandlerInterceptor
接口中的三个方法的作用。
- 预处理:在请求到达目标方法之前,可以执行一些必要的操作,如检查用户权限、解析请求参数等。
- 后处理:在请求处理完毕后,可以执行一些后续操作,如记录日志、清理资源等。
- 通用逻辑:将多个控制器中通用的逻辑提取到拦截器中,减少代码重复。
在SpringBoot中可以通过实现 HandlerInterceptor
接口来创建一个拦截器。这个接口下需要重写以下三个方法:
preHandle
:该方法在控制器处理请求之前执行,返回值表示是否中断后续操作。true
标识不中断,继续执行。false
表示中断后续操作。postHandle
:该方法在控制器处理请求之后执行,在试图渲染之前执行,可以处理后续逻辑,对视图做修改。afterCompletion
:该方法在整个请求完成后调用,即视图渲染之后,这里可以编写一些清理资源的逻辑。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
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) throws Exception {
// 在请求处理之前调用
// 这里可以编写预处理逻辑,如权限检查等
System.out.println("控制器处理请求之前执行");
return true; // 返回true表示继续执行下一个拦截器或目标方法,返回false表示中断请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求处理之后调用,但在视图渲染之前
// 这里可以编写后处理逻辑,如记录日志等
System.out.println("控制器处理请求之后,视图渲染之前调用");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整个请求完成后调用,即视图渲染之后
// 这里可以编写一些清理资源的逻辑
System.out.println("视图渲染之后调用");
}
}
实现拦截器后需要在Spring Boot的 配置类
中注册这个拦截器,并指定它应该拦截哪些路径。
import org.springframework.beans.factory.annotation.Autowired;
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 {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/**") // 拦截所有路径,你可以根据需要修改为特定的路径
.excludePathPatterns("/exclude/**"); // 排除特定路径,不被拦截
}
}
在指定拦截器拦截规则时,有两个方法:
addPathPatterns
:该方法用于指定拦截路径,例如拦截路径为/**
,表示拦截所有请求,包括对静态资源的请求。excludePathPatterns
:该方法用于排除拦截路径
,即指定不需要被拦截器拦截的请求。
当你发送请求到Spring Boot应用时,MyInterceptor
中的方法会根据程序的响应阶段而被调用,执行拦截逻辑。