1、拦截器
HandlerInterceptor接口
拦截器主要是为了做登录检查
在interceptor包下新建LoginInterceptor类,在HandlerInterceptor接口中有三个方法,分别是
public boolean preHandle(){}
public void postHandle(){}
public void afterCompletion(){}
所以在新建的LoginInterceptor中实现HandlerIntercepter接口重写三个方法
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标执行之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录检查逻辑
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if (loginUser != null){
//放行
return true;
}
//拦截住,未登录,跳转到登录页
// session.setAttribute("msg","请先登录");
// response.sendRedirect("/login");
request.setAttribute("msg","请先登录");
request.getRequestDispatcher("/").forward(request,response);
return false;
}@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") //所有请求都会拦截,静态资源也会拦截
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**"); //放行的请求
}
}
/**
* 目标方法执行完成以后
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception### 2、拦截器原理
1、根据当前请求,找到**HandlerExecutionChain【**可以处理请求的handler以及handler的所有 拦截器】
2、先来**顺序执行** 所有拦截器的 preHandle方法
- 1、如果当前拦截器prehandler返回为true。则执行下一个拦截器的preHandle
- 2、如果当前拦截器返回为false。直接 倒序执行所有已经执行了的拦截器的 afterCompletion;
**3、如果任何一个拦截器返回false。直接跳出不执行目标方法**
**4、所有拦截器都返回True。执行目标方法**
**5、倒序执行所有拦截器的postHandle方法。**
**6、前面的步骤有任何异常都会直接倒序触发** afterCompletion
7、页面成功渲染完成以后,也会倒序触发 afterCompletion
![image.png](https://img-blog.csdnimg.cn/img_convert/1a269c23f356c08e954aed64953b4229.png)
###
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
/**
* 页面渲染完成以后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
拦截器编写结束就需要配置拦截规则:
在config包下新建AdminWebConfig.java来配置规则
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") //所有请求都会拦截,静态资源也会拦截
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**"); //放行的请求
}
}