一、概述

平常我们的网站内容是不对非登录用户开放的,因此要对除了登录和注册的页面的其他任何页面进行访问拦截。

二、步骤

2.1 自定义 UserLoginInterceptor 拦截器

config目录下新建 UserLoginInterceptor 类,然后去实现 org.springframework.web.servlet.HandlerInterceptor这个接口。

重写 preHandle方法,这个方法会在控制器接受请求前调用,如果 return false则不往下进行了,则可以实现拦截。

  1. import org.springframework.web.servlet.HandlerInterceptor;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. /**
  5. * @author: yunhu
  6. * @date: 2022/6/8
  7. *
  8. * 拦截器:验证用户是否登录
  9. */
  10. public class UserLoginInterceptor implements HandlerInterceptor {
  11. @Override
  12. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  13. // 从 request 的 header 中获得 token 值
  14. String token = request.getHeader("authorization");
  15. if (token == null || token.equals("")) {
  16. return false;
  17. }
  18. // 验证 token, JwtUtil 是自己定义的类,里面有个方法验证 token
  19. String sub = JwtUtil.validateToken(token);
  20. if (sub == null || sub.equals("")) {
  21. return false;
  22. }
  23. // 更新 token 有效时间
  24. if (JwtUtil.isNeedUpdate(token)) {
  25. // 过期就创建新的 token 给前端
  26. String newToken = JwtUtil.createToken(sub);
  27. response.setHeader(JwtUtil.USER_LOGIN_TOKEN, newToken);
  28. }
  29. return true;
  30. }
  31. }

2.2 配置拦截器

定义好拦截器后,还不能直接使用,必须配置。

config目录下新建 WebMvcConfig类,实现 WebMvcConfigurer接口。

然后把刚刚自定义的用户登录的拦截器注册上。

  1. import org.springframework.context.annotation.Configuration;
  2. import org.springframework.web.servlet.config.annotation.*;
  3. /**
  4. * @author 云胡
  5. * @date 2022/6/8
  6. *
  7. * 注册自定义拦截器
  8. */
  9. @Configuration
  10. public class WebMvcConfig implements WebMvcConfigurer {
  11. @Override
  12. public void addInterceptors(InterceptorRegistry registry) {
  13. // 注册 registration 拦截器
  14. InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());
  15. // 拦截所有的路径
  16. registration.addPathPatterns("/**");
  17. // 添加不拦截路径 /api/user/login 是登录的请求, /api/user/register 注册的请求
  18. registration.excludePathPatterns(
  19. "/api/user/login",
  20. "/api/user/register",
  21. // html 静态资源
  22. "/**/*.html",
  23. // js 静态资源
  24. "/**/*.js",
  25. // css 静态资源
  26. "/**/*.css"
  27. );
  28. }
  29. }