1.创建一个拦截器类继承HandlerInterceptor
@Component
public class LoginAuthInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("LoginAuthInterceptor");return true;}
}
2.在WebMvcConfigurerd当中注册HandlerInterceptor
package com.atguigu.spzx.manager.config;import com.atguigu.spzx.manager.interceptor.LoginAuthInterceptor;
import jdk.incubator.foreign.Addressable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @version: java version 1.8* @Author: Mr Orange* @description:* @date: 2025-02-04 22:47*/
@Component
public class WebMvcConfiguration implements WebMvcConfigurer {@Autowiredprivate LoginAuthInterceptor loginAuthInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginAuthInterceptor).excludePathPatterns("/admin/system/index/login", "/admin/system/index/generateValidateCode").addPathPatterns("/**");}}
打断点看对钩有没有把拦截器注册进去
创建一个线程本地空间,将用户保存在redis当中的数据存进去。
package com.atguigu.spzx.model.entity.system;/*** @version: java version 1.8* @Author: Mr Orange* @description:* @date: 2025-02-05 0:52*/
public class SysUserThreadLocalAuthContextUtil {// 创建一个ThreadLocal对象private static final ThreadLocal<SysUser> threadLocal = new ThreadLocal<>() ;// 定义存储数据的静态方法public static void set(SysUser sysUser) {threadLocal.set(sysUser);}// 定义获取数据的方法public static SysUser get() {return threadLocal.get() ;}// 删除数据的方法public static void remove() {threadLocal.remove();}
}
完善拦截器
package com.atguigu.spzx.manager.interceptor;
import com.alibaba.fastjson.JSON;
import com.atguigu.spzx.model.entity.system.SysUser;
import com.atguigu.spzx.model.entity.system.SysUserThreadLocalAuthContextUtil;
import com.atguigu.spzx.util.AtguiguAssert;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import java.util.Set;/*** @version: java version 1.8* @Author: Mr Orange* @description:* @date: 2025-02-04 22:40*/
@Component
public class LoginAuthInterceptor implements HandlerInterceptor {@AutowiredRedisTemplate<String,String> redisTemplate;public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("LoginAuthInterceptor");// 获取请求方式String method = request.getMethod();if("OPTIONS".equals(method)) { // 如果是跨域预检请求,直接放行return true ;}//1.识别tokenString token = request.getHeader("token");AtguiguAssert.notNull(token,"用户拦截器获取的token不能为空");//2.使用token获取用户信息String json = redisTemplate.opsForValue().get("user:login:"+token);AtguiguAssert.notNull(json,"用户拦截器获取JSON失败");SysUser sysUser = JSON.parseObject(json, SysUser.class);//3.将用户信息保存SysUserThreadLocalAuthContextUtil.set(sysUser);return true;}
}
注意:放行options请求