无状态会话

6次阅读

共计 1761 个字符,预计需要花费 5 分钟才能阅读完成。

一、What?
当用户访问一个系统的时候,是 ” 不存在 ” 会话这种东西的,访问一次就断开和系统之间的连接,这种情况下一般来说需要在后台做控制来维系用户和系统之间的关系。既然 Tomcat 服务器做不到,那么可以考虑用 redis 来实现。
二、Why?
Redis-session 的好处

便于拓展,当单体应用扩展成集群会相当方便
便于权限认证

三、How?
1、当用户注册或登录时,保存唯一 Token 到 redis 中
String uniqueToken = UUID.randomUUID().toString();
redis.set(USER_REDIS_SESSION+”:”+userModel.getId(), uniqueToken, 1000 * 60 * 30);
2、当用户需要做某些操作时(比如上传文件,修改个人信息等),可以通过拦截器来对用户做验证
@Autowired
public RedisOperator redis;
public static final String USER_REDIS_SESSION = “user-redis-session”;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String userId = request.getHeader(“userId”);
String userToken = request.getHeader(“userToken”);
if(StringUtils.isNoneBlank(userId) && StringUtils.isNoneBlank(userToken)){
String uniqueToken = redis.get(USER_REDIS_SESSION + “:” + userId);
if(StringUtils.isEmpty(uniqueToken) && StringUtils.isBlank(uniqueToken)){
//userToken 在 redis 中已过时,需重新登录
System.out.println(“ 请登录。。”);
returnErrorResponse(response,IMoocJSONResult.errorTokenMsg(“ 请登录。。”));
return false;
}else{
if(!uniqueToken.equals(userToken)){
//userToken 被修改了,说明有其他人登录,这里可以控制只能一个人登录
System.out.println(“ 账号被挤出 …”);
returnErrorResponse(response,IMoocJSONResult.errorTokenMsg(“ 账号被挤出 …”));
return false;
}
}
}else{
// 消息头没有 userId 和 userToken 说明用户还未登录
System.out.println(“ 请登录。。”);
returnErrorResponse(response,IMoocJSONResult.errorTokenMsg(“ 请登录。。”));
return false;
}
return true;
}

……….
……….

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(miniInterceptor()).addPathPatterns(“/user/**”)
.addPathPatterns(“/bgm/**”)
.addPathPatterns(“/video/userLike”,”/video/userUnLike”,”/video/saveComment”)
.addPathPatterns(“/video/upload”,”/video/uploadCover”)
.excludePathPatterns(“/user/queryPublisher”);
WebMvcConfigurer.super.addInterceptors(registry);
}

正文完
 0