無狀態會話

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);
    }
相關文章
相關標籤/搜索