SpringBoot 应用拦截器

拦截器有什么用

  1. 通过重写 preHand() 办法在申请发送到控制器之前执行操作。
  2. 通过重写 postHand() 办法在响应产生到客户端之前执行操作。
  3. 通过从新 afterCompletion() 办法在实现申请和响应之后执行操作。

怎么应用拦截器

定义拦截器

实现 HandlerInterceptor 接口并重写须要的办法,并通过 @Component 注解将拦截器注入到 Spring 容器中。

@Componentpublic class TestInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {        System.out.println("preHandle");        return true;    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){        System.out.println("postHandle");    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("afterCompletion");    }    }

注册拦截器

实现 WebMvcConfigurer 接口,并通过 addInterceptors() 办法注册拦截器,同时能够通过 addPathPatterns()、excludePathPatterns() 办法指定拦截器拦挡的范畴。

@Componentpublic class TestInterceptorConfig implements WebMvcConfigurer {        @Autowired    TestInterceptor interceptor;    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(interceptor).addPathPatterns("/test1");    }}

编写控制器测试

@RestControllerpublic class TestController {        @GetMapping("/test1")    public String test1() {        System.out.println("Hello, world");        return "Hello, world.";    }}

测试后果

preHandleHello, worldpostHandleafterCompletion

多个拦截器的调用程序

当增加多个拦截器时,拦截器调用的程序如下:

addInterceptor(AInterceptor);addInterceptor(BInterceptor);addInterceptor(CInterceptor);

调用后果如下:

preHandelerApreHandelerBpreHandelerCpostHandlerCpostHandlerBpostHandlerAafterCompletionCafterCompletionBafterCompletionA

拦截器的应用场景

  • 记录接口响应相干信息:记录接口的拜访门路、参数和响应工夫等参数用于排查问题。
  • 用户登录查看:判断用户是否登录,设置 session 等相干信息。
  • 用户权限查看:应用注解和拦截器实现权限治理。
    具体实现可参考。