2.拦截器HandlerInterceptor
这里有三个方法
- after是在接收请求之前进行拦截
- post是 在数据处理中进行拦截
- pre是在接受请求之后进行拦截
/**
* 登录检查
* 1、配置拦截器要拦截那些请求
* 2. 把这些配置放在容器中
* 3.
*/
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
/**
* 执行目标方法之前
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
}
/**
* 执行目标方法之后
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* 接受请求之后
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
- 把这些配置放在容器中
- 关于mvc的配置都是在WebMvcConfigurer中
/**
* 1. 编写一个拦截器实现
* 2.拦截器注册到容器中
* 3.指定拦截规则注意拦截规则
*/
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
//配置拦截那些路径 注意,配置拦截/**(拦截所有请求) 会导致静态资源也被拦截
.addPathPatterns("/**")
//不拦截那些路径
.excludePathPatterns("");
}
}
拦截器原理
-
根据当前请求,找到HandlerExecutionChain,以及可以处理请求的handler以及所有的拦截器
-
顺序执行所有拦截器的prehandler方法
* 1.如过当前拦截器prehandler方法返回true,则执行下一个拦截器的prehandler方法 * 2.如果当前拦截器返回为false,直接倒叙执行已经执行了的拦截器的afterCompletion -
如果任何一个拦截器返回false直接跳出不执行目标方法
-
所有拦截器都返回true,执行目标方法
-
倒叙执行所有拦截器的posthandler方法
-
前面的步骤有任何异常都会直接出发afterCompletion
-
页面渲染完成之后,也会倒叙执行所有拦截器的afterCompletion