网站内建设的发展,德山经济开发区建设局网站,微信群公告如何做网站链接,火车头采集wordpress1.流程图
单机节点下的登录状态校验
分布式节点下的登录状态校验
2.代码实现
实现步骤分为如下几步
实现WebMvcConfigurer接口#xff0c;添加拦截器定义拦截器#xff0c;需要配置两个interceptor#xff0c;第一个用于刷新token#xff0c;写threadlocal#xff…1.流程图
单机节点下的登录状态校验
分布式节点下的登录状态校验
2.代码实现
实现步骤分为如下几步
实现WebMvcConfigurer接口添加拦截器定义拦截器需要配置两个interceptor第一个用于刷新token写threadlocal第二个用于判断threadlocal中是否有用户的登录信息 q1为什么这里要定义两个interceptor把刷新token的逻辑放到LoginInterceptor里边实现 a1原因是LoginInterceptor配置了页面路径排除LoginInterceptor只对需要登录的页面做校验对于不需要登录的是直接放行不会执行preHandle方法如果刷新token放在LoginInterceptor则会出现用户在不需要登录的页面操作过了一段时间仍会提醒用户没有登录的现象 a.实现WebMvcConfigurer接口配置拦截器
package com.hmdp.config;import com.hmdp.utils.LoginInterceptor;
import com.hmdp.utils.RefreshTokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.annotation.Resource;Configuration
public class MvcConfig implements WebMvcConfigurer {Resourceprivate StringRedisTemplate stringRedisTemplate;Overridepublic void addInterceptors(InterceptorRegistry registry) {// 登录拦截器registry.addInterceptor(new LoginInterceptor()).excludePathPatterns(/shop/**,/voucher/**,/shop-type/**,/upload/**,/blog/hot,/user/code,/user/login).order(1);// token刷新的拦截器registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).addPathPatterns(/**).order(0);}
}b.定义拦截器interceptor
需要配置两个interceptor第一个用于刷新token写threadlocal第二个用于判断threadlocal中是否有用户的登录信息
第一个用于从redis中取出用户的登录信息并将登录信息维护到threadlocal中
package com.hmdp.utils;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.hmdp.dto.UserDTO;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.concurrent.TimeUnit;import static com.hmdp.utils.RedisConstants.LOGIN_USER_KEY;
import static com.hmdp.utils.RedisConstants.LOGIN_USER_TTL;public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate;public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplate;}Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.获取请求头中的tokenString token request.getHeader(authorization);if (StrUtil.isBlank(token)) {return true;}// 2.基于TOKEN获取redis中的用户String key LOGIN_USER_KEY token;MapObject, Object userMap stringRedisTemplate.opsForHash().entries(key);// 3.判断用户是否存在if (userMap.isEmpty()) {return true;}// 5.将查询到的hash数据转为UserDTOUserDTO userDTO BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);// 6.存在保存用户信息到 ThreadLocalUserHolder.saveUser(userDTO);// 7.刷新token有效期stringRedisTemplate.expire(key, LOGIN_USER_TTL, TimeUnit.MINUTES);// 8.放行return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 移除用户UserHolder.removeUser();}
}
第二个从threadlocal中读用户信息判断用户是否登录 import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.判断是否需要拦截ThreadLocal中是否有用户if (UserHolder.getUser() null) {// 没有需要拦截设置状态码response.setStatus(401);// 拦截return false;}// 有用户则放行return true;}
}