拦截器(interceptor)是一种设计模式,用于在某个操作或请求的前后插入特定的行为或处理逻辑。在Web开发中,拦截器通常用于在处理HTTP请求的前后执行某些操作,例如:
身份验证和授权:在请求到达目标处理器之前,进行用户身份验证和权限检查。
日志记录:记录请求的详细信息,如来源IP、请求的URL、请求方法以及响应时间和执行时长。
数据处理与监控:预加载请求所需的数据,记录请求处理时间以进行性能监控,限制API使用频率等。例如,限制用户每分钟只能调用API有限次。
在Spring Boot中,拦截器是通过实现HandlerInterceptor接口来创建的。此接口包含如下三个主要方法。
preHandle():在请求处理之前调用。如果返回true,请求继续进行;如果返回false,请求将中断。
postHandle():在请求被处理之后,视图被渲染之前调用。
afterCompletion():在请求处理完毕后调用,这包括视图的渲染。通常用于资源清理操作。
接下来,详细介绍在Spring Boot中使用拦截器的步骤。
(1)定义一个类并实现HandlerInterceptor接口,在demo项目的根包(com.example.demo)下创建Interceptors包,并在此包下新建名为CustomInterceptor的类,代码如下。
public class CustomInterceptor 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 exception) throws Exception { // 请求完成后的逻辑处理 } }
在这个CustomInterceptor类中,可以在preHandle、postHandle和afterCompletion方法中实现自定义的逻辑,如验证、日志记录或数据处理等。
(2)要在Spring Boot应用中使用自定义拦截器,需要将其注册到应用的拦截器注册表中,可通过实现WebMvcConfigurer接口并重写addInterceptors方法来实现。
以下是如何在WebConfig类中注册自定义拦截器的示例。
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new CustomInterceptor()) .addPathPatterns("/api/**") // 指定拦截的路径 .excludePathPatterns("/api/auth/**"); // 指定不拦截的路径 } }
在这个示例配置中:
registry.addInterceptor(new CustomInterceptor()):将CustomInterceptor实例添加到拦截器注册表中。
.addPathPatterns("/api/**"):指定拦截器应拦截/api/路径下的所有请求。
.excludePathPatterns("/api/auth/**"):指定拦截器不应拦截/api/auth/路径下的请求。