首页 > 解决方案 > 如何处理竞争条件以更新会话?

问题描述

我最近在 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。

现在假设一个条件,当服务器接收到多个具有相同 session-id 的请求时,这些请求有资格更新。我根据第一个请求续订会话。

场景

  1. 会话未在商店中更新。因此,我将使用另一个新的会话 ID 更新上一个会话。在这种情况下,用户将拥有多个 session-id。
  2. 会话在商店中更新。现在,上一个会话将无法在商店中使用。如果它是授权会话,我将不得不要求用户再次登录。或者我将创建另一个会话。

如何处理这种竞争条件?

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

标签: node.jssession

解决方案


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

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


推荐阅读