购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5.3 拦截器

拦截器(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/路径下的请求。 16SjAz6zYJT1FPvx6/b9IIVXpkS18dHp7E3kpTmSQwuuvIaKRDT3Za6HjX2C3LM0

点击中间区域
呼出菜单
上一章
目录
下一章
×