文章目录
一、编写一个拦截器实现HandlerInterceptor 接口
//登录检查
public class Logininterceptor implements HandlerInterceptor {
//目标方法执行前
@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;
}
//拦截住未登录,跳转登录页
response.sendRedirect("/");
session.setAttribute("msg","请先登录!");
return false;
}
//目标方法执行后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//页面渲染以后
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
执行顺序:preHandle->目标方法mainPage->postHandle->afterCompletion
二、将拦截器添加到容器中(实现WebMvcConfigurer的addInterceptors方法)
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new Logininterceptor())
.addPathPatterns("/**") //静态资源也会拦截
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");//放行
}
}
三、制定拦截规则
注意静态资源也会被拦截,要设置通过。
.addPathPatterns("/**") //静态资源也会拦截
.excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");//放行
四、拦截器的执行时机和原理
1.根据当前请求,找到HandlerExecutionChain(可以处理请求的handler以及handler的所有 拦截器)
2.先来顺序执行 所有拦截器的 preHandle()方法。
如果当前拦截器preHandle()返回为true。则执行下一个拦截器的preHandle()
如果当前拦截器返回为false。直接倒序执行所有已经执行了的拦截器的 afterCompletion();。
3.如果任何一个拦截器返回false,直接跳出不执行目标方法。
4.所有拦截器都返回true,才执行目标方法。
5.倒序执行所有拦截器的postHandle()方法。
6.前面的步骤有任何异常都会直接倒序触发 afterCompletion()。
7.页面成功渲染完成以后,也会倒序触发 afterCompletion()。