代码之家  ›  专栏  ›  技术社区  ›  Amit Kumar Gupta

如何处理续约会话的竞争条件?

  •  0
  • Amit Kumar Gupta  · 技术社区  · 7 年前

    function createSession(){
        // read encrypted session-id from the request
        if( sessionId ){
          // decrypt it
          if (decryptedSessionId ) {
            //read session detail from the store
            options.store.get(decryptedSessionId, (err, sessionFromStore) => {
              if(err){
                throw Error(err);
              }else if( sessionFromStore){
                if( shouldRenew(sessionFromStore) ){
                  //delete previous session
                  options.store.destroy(sessionFromStore.id, err=> {
                    //update the session object in memory
                  });
                }
              }else{ //session detail is not present in store
                // create new session
              }
            }); 
          } else { //invalid or tempered session
            // throw error
          }
        }else{ //session-id is not presnet in request
          // create new session
        }
    }
    

    正如您所注意到的,当会话有效并且通过删除上一个会话来满足某些条件时,我正在续订会话。但我不会马上在店里更新。相反,我更新存储中的会话信息,并在将响应发送到客户端时设置cookies。

    情节

    1. 存储区中未更新会话。因此,我将用另一个新会话id续订上一个会话。在这种情况下,用户将拥有多个会话id。
    2. 存储中的会话已更新。现在,上一个会话将在应用商店中不可用。如果是授权会话,我将不得不要求用户再次登录。或者我会创建另一个会话。

    如何处理这种竞争状况?

    Here 是完整的代码,以备不时之需。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Amit Kumar Gupta    7 年前

    如果我们只验证主路由,这种情况似乎不会发生。

    我以前想验证每个请求。服务器只能在页面加载时接收具有相同会话ID的多个请求,页面加载包括访问主路由以及CSS、js等静态文件。静态文件不需要进行身份验证。因此不应出现竞态条件。

    推荐文章