1、HandlerInterceptor 接口
    image.png

    1. /**
    2. * 登录检查
    3. * 1、配置好拦截器要拦截哪些请求
    4. * 2、把这些配置放在容器中
    5. */
    6. @Slf4j//日志
    7. public class LoginInterceptor implements HandlerInterceptor {
    8. /**
    9. * 目标方法执行之前
    10. * @param request
    11. * @param response
    12. * @param handler
    13. * @return
    14. * @throws Exception
    15. */
    16. @Override
    17. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    18. String requestURI = request.getRequestURI();
    19. log.info("preHandle拦截的请求路径是{}",requestURI);
    20. //登录检查逻辑
    21. HttpSession session = request.getSession();
    22. Object loginUser = session.getAttribute("loginUser");
    23. if(loginUser != null){
    24. //放行
    25. return true;
    26. }
    27. //拦截住。未登录。跳转到登录页
    28. request.setAttribute("msg","请先登录");
    29. // re.sendRedirect("/");
    30. request.getRequestDispatcher("/").forward(request,response);
    31. return false;
    32. }
    33. /**
    34. * 目标方法执行完成以后
    35. * @param request
    36. * @param response
    37. * @param handler
    38. * @param modelAndView
    39. * @throws Exception
    40. */
    41. @Override
    42. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    43. log.info("postHandle执行{}",modelAndView);
    44. }
    45. /**
    46. * 页面渲染以后
    47. * @param request
    48. * @param response
    49. * @param handler
    50. * @param ex
    51. * @throws Exception
    52. */
    53. @Override
    54. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    55. log.info("afterCompletion执行异常{}",ex);
    56. }
    57. }

    image.png
    2、配置拦截器

    1. /**
    2. * 1、编写一个拦截器实现HandlerInterceptor接口
    3. * 2、拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
    4. * 3、指定拦截规则【如果是拦截所有,静态资源也会被拦截】
    5. */
    6. @Configuration
    7. public class AdminWebConfig implements WebMvcConfigurer {
    8. @Override
    9. public void addInterceptors(InterceptorRegistry registry) {
    10. registry.addInterceptor(new LoginInterceptor())
    11. .addPathPatterns("/**") //所有请求都被拦截包括静态资源
    12. .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**"); //放行的请求,也就是controller处理器方法上访问的路径。
    13. }
    14. }

    3、拦截器原理:
    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

    image.png