快速会话:第二个用户会话覆盖的第一个用户会话

时间:2016-09-06 00:59:18

标签: javascript express ejs

这是一个get请求,用户被传递给视图

app.get('/blog/:id', function(req, res) {
  // Define which page
  res.render('blog', {
    user: req.user,
});
}); 

这是一个textarea,此页面上的所有用户都应该存储其名称。

<textarea readonly id="usersInRoom" placeholder="<%= user.username %>"></textarea>

这成功地将正确的用户名设置为占位符。如果第二个用户呈现相同的视图并与第一个用户同时访问此页面,则第二个用户的用户名将是唯一的占位符。如何存储第一个用户名,以便当第二个用户打开页面时,占位符可以是第一个用户名+第二个用户名的串联?第一个用户存储在任何嵌入式javascript数组等中的数据不可供第二个用户使用。

2 个答案:

答案 0 :(得分:0)

如果您使用的是SignalR,那么您可以将当前的用户列表广播到每个连接,并像sample chat application一样更新视图。

如果使用常规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类(将其作为CurrentPageUsers表存储在DbContext中):

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实现具有更好的性能,并且在服务器端实现不那么笨拙,不需要数据库表来存储当前页面用户。它是为这种情况而制作的。

答案 1 :(得分:0)

我找到了解决方案。事实上我确实有持续登录会话的快速会话。第一个会话被第二个用户覆盖,该用户在第一个用户在线时登录,用第二个用户替换了第一个用户的凭证,现在我在两个不同的浏览器中有用户2在线。

虽然我在不同的浏览器上尝试过这种方式,但是来自不同的设备,的问题是节点应用是在localhost本地托管。当我将应用程序上传到heroku并从那里访问时,用户会话没有被覆盖。