node + express限制用户异地/多处登陆问题方案

后端:Node + Express框架
前端:Vue框架

实现功能:
限制同一用户在不同浏览器登陆,解释如下:
例如用户A在PcA处以用户名user进行了登陆,用户B在PcB处以用户名user进行登陆时,浏览器提示用户”user已在另一处登陆,是否踢其下线?”
此时,用户B选择是,则用户A提示下线,用户B上线

当前方案:
利用express-session:用户A登陆后,用户名和密码保存于session和cookie中(session做永久化处理,存储于mongo数据库中),用户B登陆时在数据库中查询是否有user用户,如果有则返回是否踢用户A下线的提示,用户B选择是,则后端主动过期用户A的cookie

我的问题:

  1. 限制同一用户在不同浏览器登陆的功能,利用session这个方案是否合理?
  2. 我理解每个浏览器向后端发送请求后,都会形成相应的session保存起来,查询session数据一般是怎样实现的?例如,怎样查询包含”user“的session的”id“
  3. 怎样实现后端主动向前端发起请求?比如用户A未向后端发起请求的情况下,后端直接修改用户A的cookie,使之过期?
  4. 如果方案不合理,还请指点,感谢!
阅读 8.3k
2 个回答

楼主的问题

  1. 限制同一用户在不同浏览器登陆的功能,利用session这个方案是否合理?-- 合理
  2. 我理解每个浏览器向后端发送请求后,都会形成相应的session保存起来,查询session数据一般是怎样实现的?例如,怎样查询包含”user“的session的”id“ -- 这个是session store的实现细节,不同的store不一样,一般是存在数据库里(mysql、mongo、redis等)。session id是可以自定义的,只要能跟用户名关联起来就行
  3. 怎样实现后端主动向前端发起请求?比如用户A未向后端发起请求的情况下,后端直接修改用户A的cookie,使之过期? -- 这里在服务端清除session即可,有官方的api store.destroy(sid, callback)

怎么限制同个用户不能多个地方同时登录

实现思路楼主应该是有的,只是实现细节不清楚:

  1. 用户登录,存储session。每个用户的session对应一个id,假设就是用户名。
  2. 用户再次登录,检测当前用户是否已经登录 -> 检测该用户名,是否已经存在session。

楼主不清除的应该是,怎么把 用户名、session id关联起来,包括怎么在有用户名的情况下,查询到该用户名对应的session。

如果用express-session,可以这么实现。

genid选项:生成session id

genid返回的是session对应的id,楼主根据实际情况进行自定义。

app.use(session({
  genid: function (req) {
    return req.query.usrname; // 生成session的id
  }
}));

session检测

用户再次登录,通过session id 去检测session是否存在,以此判断用户是否已登录。

app.use(function (req, res, next) {
  req.sessionStore.get(req.query.usrname, function (error, session) {
    // 如果session存在,表示用户已在其他地方登录
  });
});
新手上路,请多包涵

嗯,表示登陆然后呢?怎么班这个时候是不是主动想服务端发送不请求,核心功能不知道scoket.io有没有了解,如果要实现这个功能就要实时监听服务端session id的状态! 我觉得我的提醒可以让你将这篇文章写的更好一些!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏