无状态会话

一、What?

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

二、Why?

Redis-session的好处

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

三、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);
    }
    原文作者:Nathan
    原文地址: https://segmentfault.com/a/1190000018779644
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞