Express-session:第一个用户会话被第二个用户会话覆盖
Express-session: first user session overwritten by second user session
这是一个get请求,用户被传递到视图
app.get('/blog/:id', function(req, res) {
// Define which page
res.render('blog', {
user: req.user,
});
});
这是一个文本区,该页面上的所有用户都应该存储他们的名字。
<textarea readonly id="usersInRoom" placeholder="<%= user.username %>"></textarea>
这将成功设置正确的用户名作为占位符。如果第二个用户呈现相同的视图并与第一个用户同时访问此页面,则第二个用户的用户名将是唯一的占位符。如何存储第一个用户名,以便当第二个用户打开页面时,占位符可以是第一个用户名+第二个用户名的串联?第一个用户存储在任何嵌入式javascript数组等中的数据对第二个用户不可用。
如果您正在使用SignalR,那么您可以向每个连接广播当前用户列表并更新视图,就像在示例聊天应用程序中一样。
如果您使用的是常规ajax服务器轮询,请设置一个客户端方法,该方法间隔从数据库存储获取当前页面用户列表。由于http缺乏状态,如果用户有一段时间没有发帖,你将不得不把他们从列表中"退休"。
客户机代码:setInterval(checkServer,5000);
function checkServer(){
//some ajax call to the server here
//that returns your user list
...
success:function(result){
$('#usersInRoom').val(result);
}
}
服务器代码(假设您将所有当前页面用户保存在一个表中)包含一个名为LastModified的字段):
CurrentPageUser类(将其存储在DbContext中作为CurrentPageUsers表):
public class CurrentPageUser{
public int Id {get;set;}
public DateTime LastModified {get;set;}
public string Name {get;set;}
}
控制器方法:public string GetCurrentUsers(int selfid){
using (var db=new DbContext()){
var now=DateTime.Now;
//update your requesting user so other users can see him/her
db.CurrentPageUsers.Find(selfid).LastModified=now;
db.SaveChanges();
DateTime timelimit = now.AddMinutes-5);
return string.Join(", ",
db.CurrentPageUsers.Where(u=>
u.LastModified<timelimit).Select(u=>u.Name).ToList());
}
}
请注意,SignalR的实现具有更好的性能,并且在服务器端实现时不那么笨拙,不需要数据库表来存储当前页面用户。
我找到了一个解决方案。事实上,我确实有express-session来保存我的登录会话。第一个会话被第二个用户覆盖,这个用户在第一个用户在线时登录,它用第二个用户替换了第一个用户的凭据,现在我在两个不同的浏览器中有用户2在线。
虽然我在不同的浏览器上尝试了这个,从不同的设备,问题是节点应用程序在本地托管在localhost。当我将应用程序上传到heroku并从那里访问它时,用户会话没有被覆盖。
- 如何检测用户是否在同一会话中打开了多个窗口或选项卡
- DreamFactory REST API POST休息/用户/会话请求总是在IE9中返回错误
- 如何获取登录到当前会话的用户的ID
- JavaScript 中的用户会话跟踪
- 允许同一用户在不同数量的设备上多次登录以及如何处理会话
- 在每个 AJAX 请求(Sencha Touch 2)中发送用户详细信息(会话令牌)
- 如何在没有JQuery的情况下,通过对服务器的基本ajax调用,根据浏览器上的用户活动保持服务器会话活动
- Zkoss:如何通知用户会话超时或与服务器的连接丢失
- 我该如何在允许用户导航到其他页面的同时,使用strophe保持聊天会话的打开
- 每个用户/浏览器会话只加载一次Javascript
- 用户使用会话变量登录
- 具有多个用户或会话的网页
- 当用户刷新页面时,如何在单独的服务器中处理socket.io上的会话
- 可以'在尝试使用chai请求代理为测试维护用户会话时,t在发送标头后设置标头出错
- 如何将用户会话保存在PHP中的一个变量中,以便在JavaScript中引用
- Passport本地策略未将用户保存在cookie或会话中
- 当用户移回登录页面时清除会话
- 当用户关闭选项卡或窗口时销毁会话
- 使用 http 删除终止用户会话
- 尝试让PHP会话用户进入JavaScript