node.js - 如何处理竞争条件以更新会话?
问题描述
我最近在 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 的请求时,这些请求有资格更新。我根据第一个请求续订会话。
场景
- 会话未在商店中更新。因此,我将使用另一个新的会话 ID 更新上一个会话。在这种情况下,用户将拥有多个 session-id。
- 会话在商店中更新。现在,上一个会话将无法在商店中使用。如果它是授权会话,我将不得不要求用户再次登录。或者我将创建另一个会话。
如何处理这种竞争条件?
这是完整的代码,以备不时之需。
解决方案
如果我们只验证主路由,这种情况似乎不会发生。
我以前在考虑对每个请求进行身份验证。服务器只能在页面加载时接收具有相同会话 ID 的多个请求,其中包括访问主路由以及 CSS、js 等静态文件。静态文件不需要经过身份验证。因此不应该出现竞争条件。
推荐阅读
- c# - 通过 DecompileTypeAsString 反编译时如何反编译生成相同代码的特定方法
- android - Android导航组件不适用于对话框片段
- flutter - Flutter:应用内产品在产品名称旁边显示应用名称
- javascript - Zapier 的代码循环遍历一组对象,每个对象提取一个值,然后平均这些值
- android - 计时器完成后重定向到不同的片段
- accessibility-insights - Accessibility Insights for Windows 中的 ControlType 是什么,它如何映射到 HTML 元素?
- python - 如何在 pyspark 环境会话中设置 blob conf
- bash - 如何处理超时运行的脚本的非超时异常?
- angular - 选择控件绑定在 Angular 8 中不起作用
- python - 我的输入有时需要多次才能进入 if 语句