SpringBoot中的拦截器

时间:2021-04-22 01:19:09

SpringBoot中拦截器还是延用的SpringMVC里的拦截器.

使用方式:

1.编写一个类实现HandlerInterceptor接口,并实现里面的三个方法

2.编写一个类实现WebMvcConfigurer接口对拦截器进行注册

在 Spring Boot 中,一个拦截器会拦截客户端的请求,执行三个方法:

  • preHandle:在进入 Controller 方法之前执行该方法,如果这个方法返回了 false,则请求会被拦截中止,Controller 方法将不会被执行。
  • postHandle:在 Controller 方法执行完成之后,在视图渲染之前执行,可以在返回的 ModelAndView 中加入数据或者对数据进行处理。
  • afterCompletion:在视图渲染之后执行,用于清理资源等工作。如果发生了异常,则可以在该方法中进行异常处理、记录日志等工作。

需要注意的是:

  1. preHandle 方法是在请求进入 Controller 方法之前执行的,postHandleafterCompletion 方法是在 Controller 方法返回 ModelAndView 之后执行的。

  2. 当多个拦截器同时存在时,preHandle 方法会按照添加拦截器的顺序依次执行,而 postHandleafterCompletion 方法则按照添加拦截器的倒序依次执行。也就是说,如果我们向拦截器链中添加了 A、B、C 三个拦截器,那么它们的执行顺序为:A.preHandle() -> B.preHandle() -> C.preHandle() -> Controller 方法执行 -> C.afterCompletion() -> B.afterCompletion() -> A.afterCompletion()。

  3. 如果在 preHandle 方法中抛出了异常,请求将被拦截中止,并通过 afterCompletion 方法进行异常处理和清理工作。

  4. 如果在 postHandle 方法中抛出了异常,则请求能正常执行完成,但是无法返回视图,也无法进行数据处理和资源清理。此时我们需要使用 afterCompletion 方法来进行异常处理和清理工作。

1.编写一个类实现HandlerInterceptor接口,并实现里面的三个方法

SpringBoot中的拦截器

 2.编写一个类实现WebMvcConfigurer接口对拦截器进行注册SpringBoot中的拦截器

 实体类SpringBoot中的拦截器

 SpringBoot中的拦截器

拦截器可以有多个,可以使用@Order进行分别拦截

也可以使用下面例子实现多个拦截器

@Configuration

public class WebMvcConfig implements WebMvcConfigurer {

@Bean public Interceptor1 interceptor1() {

        return new Interceptor1();

}

@Bean public Interceptor2 interceptor2() {

        return new Interceptor2();

}

@Override

public void addInterceptors(InterceptorRegistry registry) {         registry.addInterceptor(interceptor1()).addPathPatterns("/api/**").order(Ordered.HIGHEST_P        RECEDENCE);         registry.addInterceptor(interceptor2()).addPathPatterns("/user/**").order(Ordered.LOWEST_        PRECEDENCE); }

}