一、拦截器
SpringMvc为我们提供了一个拦截器,可以用于对一些需要登录才可以访问的URL(页面)进行访问控制,在访问URL(页面)之前进行拦截校验;
拦截器的使用步骤
1. 自定义拦截器
- 自定义拦截器就是实现与HandlerInterceptor接口
- prehandle方法:在访问某个方法之前执行
- aftercomplete:在方法执行后执行
/**
* 登录拦截器:用于拦截没有登录的资源状态
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if(user!=null){
return true;
}
return false;
}
}
2. 创建配置类添加Interceptor
- 实现WebMvcConfiguer,重写添加拦截器方法
- 将我们自定义规则的拦截器加入里面
@Configuration
public class MyConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/js/**","/login","/");
}
}
二、拦截器执行原理
执行步骤原理
- 根据当前请求,找出能处理当前请求的Handler(HandlerExecutionChain),以及拦截器链(InterceptorList)
- 在目标方法之前,执行拦截器操作
- 执行拦截器中preHandle()
- 如果拦截器前置方法返回true,则继续执执行下一个拦截器的前置方法
- 如果有任何一个拦截器前置方法返回false,则执行triggerAfter,倒序执行已执行的拦截器的afterCompletion方法
- 执行拦截器中preHandle()
3. 如果有任何拦截器返回flase,则直接跳出,不执行目标方法
4. 当所有拦截器返回true,则执行目标方法,之后倒序执行拦截器当中postHandle方法
5. 当前面步骤执行出现异常,也一样倒序执行afterComplete()方法,
6. 页面执行完成,也倒序执行afterComplete方法;