如何处理竞争条件以续订会话?



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

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 续订上一个会话。在这种情况下,用户将具有多个会话 ID。
  2. 会话在存储中更新。现在,上一个会话在商店中将不可用。如果是授权会话,我将不得不要求用户再次登录。或者,我将创建另一个会话。

如何处理此竞争条件?

这是完整的代码,以防我们需要。

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

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

最新更新