SpringBoot中拦截器还是延用的SpringMVC里的拦截器.
使用方式:
1.编写一个类实现HandlerInterceptor接口,并实现里面的三个方法
2.编写一个类实现WebMvcConfigurer接口对拦截器进行注册
在 Spring Boot 中,一个拦截器会拦截客户端的请求,执行三个方法:
-
preHandle
:在进入 Controller 方法之前执行该方法,如果这个方法返回了false
,则请求会被拦截中止,Controller 方法将不会被执行。 -
postHandle
:在 Controller 方法执行完成之后,在视图渲染之前执行,可以在返回的 ModelAndView 中加入数据或者对数据进行处理。 -
afterCompletion
:在视图渲染之后执行,用于清理资源等工作。如果发生了异常,则可以在该方法中进行异常处理、记录日志等工作。
需要注意的是:
-
preHandle
方法是在请求进入 Controller 方法之前执行的,postHandle
和afterCompletion
方法是在 Controller 方法返回 ModelAndView 之后执行的。 -
当多个拦截器同时存在时,
preHandle
方法会按照添加拦截器的顺序依次执行,而postHandle
和afterCompletion
方法则按照添加拦截器的倒序依次执行。也就是说,如果我们向拦截器链中添加了 A、B、C 三个拦截器,那么它们的执行顺序为:A.preHandle() -> B.preHandle() -> C.preHandle() -> Controller 方法执行 -> C.afterCompletion() -> B.afterCompletion() -> A.afterCompletion()。 -
如果在
preHandle
方法中抛出了异常,请求将被拦截中止,并通过afterCompletion
方法进行异常处理和清理工作。 -
如果在
postHandle
方法中抛出了异常,则请求能正常执行完成,但是无法返回视图,也无法进行数据处理和资源清理。此时我们需要使用afterCompletion
方法来进行异常处理和清理工作。
1.编写一个类实现HandlerInterceptor接口,并实现里面的三个方法
2.编写一个类实现WebMvcConfigurer接口对拦截器进行注册
实体类
拦截器可以有多个,可以使用@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); }
}