SpringBoot 应用拦截器
拦截器有什么用
- 通过重写 preHand() 办法在申请发送到控制器之前执行操作。
- 通过重写 postHand() 办法在响应产生到客户端之前执行操作。
- 通过从新 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 等相干信息。
- 用户权限查看:应用注解和拦截器实现权限治理。
具体实现可参考。