登录检查与静态资源放行

编写一个拦截器,实现 HandlerInterceptor 接口

  1. public class LoginInterceptor implements HandlerInterceptor {
  2. /**
  3. * 目标方法执行之前
  4. *
  5. * @param request
  6. * @param response
  7. * @param handler
  8. * @return
  9. * @throws Exception
  10. */
  11. @Override
  12. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  13. String requestURI = request.getRequestURI();
  14. log.info("拦截的请求路径是{}", requestURI);
  15. // 登录检查逻辑
  16. HttpSession session = request.getSession();
  17. if (session.getAttribute("loginUser") != null) {
  18. return true;
  19. }
  20. log.info("有请求被拦截了");
  21. //跳转到登录页
  22. session.setAttribute("msg", "请先登录");
  23. response.sendRedirect("/");
  24. return false;
  25. }

拦截器注册到容器中,并指定拦截规则

实现 WebMvcConfigurer 的 addInterceptors 方法

  1. @Configuration
  2. public class AdminWebConfig implements WebMvcConfigurer {
  3. /**
  4. * 拦截器
  5. *
  6. * @param registry
  7. */
  8. @Override
  9. public void addInterceptors(InterceptorRegistry registry) {
  10. // /** 拦截所有的请求
  11. registry.addInterceptor(new LoginInterceptor()).
  12. addPathPatterns("/**").
  13. excludePathPatterns(
  14. "/",
  15. "/login",
  16. "/css/**",
  17. "/js/**",
  18. "/fonts/**",
  19. "/images/**"
  20. );
  21. }
  22. }

放行静态资源的2种方案

如果是拦截所有请求,静态资源请求也会被拦截

1、挨个儿放行 /css、/js、/fonts、/images 等静态资源请求前缀

好处是不需要改动模板文件,只需要在配置拦截器时多添加几条规则即可。

2、配置静态资源访问路径前缀,然后放行前缀

  1. spring:
  2. mvc:
  3. static-path-pattern: /static/**

拦截器的执行时机和原理【原理分析】