当前位置:   article > 正文

springboot:拦截器_request.setattribute还没完成页面已渲染完成

request.setattribute还没完成页面已渲染完成

1、自定义拦截器

  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. }

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/**"); //放行的请求
  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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/716503
推荐阅读
相关标签
  

闽ICP备14008679号