无状态会话

1、What?

当用户访问一个系统的时候,是"不存在"会话这种东西的,访问一次就断开和系统之间的链接,这种状况下通常来讲须要在后台作控制来维系用户和系统之间的关系。既然Tomcat服务器作不到,那么能够考虑用redis来实现。

2、Why?

Redis-session的好处

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

3、How?

一、当用户注册或登陆时,保存惟一Token到redis中

String uniqueToken = UUID.randomUUID().toString();
redis.set(USER_REDIS_SESSION+":"+userModel.getId(), uniqueToken, 1000 * 60 * 30);

二、当用户须要作某些操做时(好比上传文件,修改我的信息等),能够经过拦截器来对用户作验证

@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);
    }
相关文章
相关标签/搜索