第一步:创建一个类,实现HandlerInterceptor接口
public class LOngininterceptor implements HandlerInterceptor {
private StringRedisTemplate stringRedisTemplate;
public LOngininterceptor(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//TODO 获取session
//HttpSession session = request.getSession();
//获取请求头中的token
String token = request.getHeader("authorization");
if (StrUtil.isBlank(token))
{
//不存在拦截
response.setStatus(401);
return false;
}
//获取用户
//Object user = session.getAttribute("User");
Map<Object, Object> objectMap = stringRedisTemplate.opsForHash().entries("LOGIN_UESR_KEY" + token);
//判断用户是否存在
if (objectMap.isEmpty())
{
//不存在拦截
response.setStatus(401);
return false;
}
//将查询到的hash数据转为USERDTO
UserDTO userDTO = BeanUtil.fillBeanWithMap(objectMap, new UserDTO(), false);
//存在,保存用户信息到ThreadLocal
UserHolder.saveUser(userDTO);
//刷新token有效期
stringRedisTemplate.expire("LOGIN_UESR_KEY" + token,30L, TimeUnit.MINUTES);
//放行
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//移除用户
UserHolder.removeUser();
}
}
第二步:封装ThreadLocal,用来保存信息
public class UserHolder {
private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();
public static void saveUser(UserDTO user){
tl.set(user);
}
public static UserDTO getUser(){
return tl.get();
}
public static void removeUser(){
tl.remove();
}
}
第三步:创建一个配置类,实现WebMvcConfigurer接口,添加一个拦截器
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LOngininterceptor(stringRedisTemplate)).excludePathPatterns(
"/user/login",
"/user/code",
"/blog/hot",
"/upload/**",
"/shop-type/**",
"/shop/**",
"/voucher/**"
);
}
}