如何应对比赛条件续约?

时间:2018-10-06 12:43:17

标签: node.js session

我最近在node.js中为Muneem Web框架编写了一个会话管理插件。这是创建新会话的伪代码;

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
    }
}

您会注意到,我将通过删除上一个会话来更新一个有效且满足某些条件的会话。但是我不会立即在商店中更新它。相反,我将更新存储中的会话信息,并在将响应发送到客户端时设置cookie。

现在假设一个条件,即服务器收到具有相同会话ID且可以续约的多个请求。我根据第一个请求续订会话。

场景

  1. 会话未在商店中更新。因此,我将使用另一个新的会话ID续订上一个会话。在这种情况下,用户将具有多个session-id。
  2. 会话在商店中更新。现在,以前的会话将在商店中不可用。我必须要求用户再次登录,如果它是授权的会话。否则,我将创建另一个会话。

如何处理这种比赛情况?

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

1 个答案:

答案 0 :(得分:0)

如果仅对主路径进行身份验证,则似乎不会发生这种情况。

我以前曾想对每个请求进行身份验证。服务器仅在页面加载时才能接收具有相同会话ID的多个请求,这包括对主路由的访问以及CSS,JS等静态文件。不需要验证静态文件。因此,不应出现种族状况。