SpringBoot 使用拦截器
拦截器有什么用
- 通过重写 preHand() 方法在请求发送到控制器之前执行操作。
- 通过重写 postHand() 方法在响应发生到客户端之前执行操作。
- 通过重新 afterCompletion() 方法在完成请求和响应之后执行操作。
怎么使用拦截器
定义拦截器
实现 HandlerInterceptor 接口并重写需要的方法,并通过 @Component 注解将拦截器注入到 Spring 容器中。
@Component
public 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() 方法指定拦截器拦截的范围。
@Component
public class TestInterceptorConfig implements WebMvcConfigurer {
@Autowired
TestInterceptor interceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor).addPathPatterns("/test1");
}
}
编写控制器测试
@RestController
public class TestController {
@GetMapping("/test1")
public String test1() {
System.out.println("Hello, world");
return "Hello, world.";
}
}
测试结果
preHandle
Hello, world
postHandle
afterCompletion
多个拦截器的调用顺序
当添加多个拦截器时,拦截器调用的顺序如下:
addInterceptor(AInterceptor);
addInterceptor(BInterceptor);
addInterceptor(CInterceptor);
调用结果如下:
preHandelerA
preHandelerB
preHandelerC
postHandlerC
postHandlerB
postHandlerA
afterCompletionC
afterCompletionB
afterCompletionA