1. Interceptor
拦截器
1.1. 拦截器概述
HandlerInterceptor
接口,该接口提供了拦截器的功能,如果自定义拦截器就要实现该接口
,HandlerInterceptor
源码如下
public interface HandlerInterceptor {
// 该方法会在控制器方法前执行
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
// 该方法会在控制器方法调用之后,且解析视图之前执行
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
// 该方法会在整个请求完成,即视图渲染结束之后执行
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
Interceptor
依赖于 web
框架,我们经常在 SpringMVC
中用到该配置,在这个场景下 Interceptor
就依赖于 SpringMVC
框架。Interceptor
基于 Java
的反射机制,属于AOP
的一种运用
- 由于拦截器是基于
web
框架的调用,因此可以使用Spring
的依赖注入进行一些业务操作,同时一个拦截器实例在一个Controller
生命周期之内可以多次调用 - 只能对
Controller
请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理
1.2. 拦截器中方法的执行流程
- 请求到达
DispatcherServlet
,DispatcherServlet
发送至Interceptor
,执行preHandle()
方法,该方法会返回一个布尔值。如果为false
,则结束所有流程:如果为true
, 则执行下一步 - 请求达到
Controller
,执行处理器逻辑,它包含控制器的功能 - 执行
postHandle()
方法 - 执行视图解析和视图渲染
- 执行
afterCompletion()
方法
1.3. 拦截器的配置
1.3.1. 传统项目拦截器的配置
基于 SpringMVC
的项目 ,我们之前的案例配置拦截器的方式如下
1.3.2. SpringBoot
项目拦截器的配置
1.3.2.1. 实现 HandlerInterceptor
接口编写拦截器
继承 HandlerInterceptorAdapter
也可以,它是 HandlerInterceptor
的子类
public class MyInterceptor implements HandlerInterceptor {
// preHandle在执行Controller之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("MyInterceptor-处理器执行前方法preHandle,返回true则不拦截后续的处理");
return true;
}
// postHandle在请求执行完之后 渲染ModelAndView返回之前执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
HandlerInterceptor.sup