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 {
@Autowired
private LoginAuthInterceptor loginAuthInterceptor;
@Override
public 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 {
@Autowired
RedisTemplate<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.识别token
String 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请求