Spring 拦截器是在处理请求的过程中,可以在特定的时机对请求进行一些处理,比如记录日志、进行权限校验、统计请求时间等。
实现步骤:
- 创建一个拦截器类,实现 HandlerInterceptor 接口,并重写其方法。
- 在 Spring 配置文件中添加拦截器配置,可以配置拦截的 URL,也可以对所有 URL 进行拦截。
- 在拦截器的方法中编写拦截器逻辑,比如在 preHandle 方法中进行权限校验,在 postHandle 方法中记录日志,在 afterCompletion 方法中统计请求时间等。
- 在控制器类或方法上通过 @InterceptorRef 注解指定拦截器。
拦截器原理:
- 在请求到达 DispatcherServlet 前会先经过拦截器链中的所有拦截器的 preHandle 方法。
- 如果 preHandle 方法返回 true,则继续执行下一个拦截器的 preHandle 方法,直到所有拦截器的 preHandle 方法都返回 true。
- 如果有拦截器的 preHandle 方法返回 false,则请求停止向下执行,返回到拦截器链中已经执行过的拦截器的 afterCompletion 方法。
- 如果所有拦截器的 preHandle 方法都返回 true,则执行控制器方法,并根据控制器方法的返回值来确定是否执行拦截器链中的 afterCompletion 方法。
- 执行完控制器方法后,会执行拦截器链中所有拦截器的 postHandle 方法,并将控制器方法的返回值传递给拦截器的 postHandle 方法。
- 最后执行拦截器链中所有拦截器的 afterCompletion 方法。