node 如保控制重复登陆,求高手解答
发布于 8个月前 作者 sunzhiguang 872 次浏览

如何控制同一用户名不同浏览器可以登陆问题。

15 回复

登录的用户信息不是保存到req.session.user中了吗?楼主可以用这个进行判断啊。

@struCoder 目前,我就是这样处理的,这样控制不了不同浏览器

@sunzhiguang 额,是不同的浏览器啊,那干脆在数据库中加一个字段呗,isLogin,值就是true 或者false,用户登录时进行查询判断。这是我想到的办法,可能还有更好的解决办法。:)

1、服务端保存一个用户的会话Id与用户Id的映射关系 2、用户每次登录:检查这个关系中是否存在登录用户的Id,如果存在,则删除关系(如果是重复登录,那么上一次登录的会话关系就被删除了,上一次登录的用户再访问网站时,由于关系被删除,就没有会话了),不存在则建立关系 3、用户是否登录:检查映射关系中是否存在当前请求提交的会话Id与用户Id的映射关系

有个很老很有用的方式,用数据库做session控制

@hainee 我是通过这样实现的,跟你说的道理是一样的。将对应关系放到node的一个全局变量中。来进行判断的。 不知道这个方法好不好。 global.session = {};

exports.setSession = function(sessionID,name){ session[sessionID] = name; } exports.getSession = function(sessionID){ return session[sessionID]; }

可以啊,不过具体的思路应该是这样的: global.name_session = {}; global.session_name = {}; exports.setSession = function(sessionId,name) { //如果在会话关系中存在相同用户名的会话,则将旧的会话注销掉 var oldSessionId = global.name_session[name]; if(oldSessionId) { exports.delSession(oldSessionId);//注销旧的会话 } //注册一个新的会话 global.session_name[sessionId] = name; global.name_session[name] = sessionId; } exports.getSession = function(sessionId){ return global.session_name[sessionId]; } exports.delSession = function(sessionId) { var name = global.session_name[sessionId]; if(!name) return false; delete global.session_name[sessionId]; delete global.name_session[name]; return true; }

exports.checkSession = function(sessionId) { return global.session_name[sessionId] ? true:false; }

@hainee
使用全局变量,好简单粗暴

@fantasyni 对于简单的小网站,简单粗暴是最好的,杀鸡就用小刀,杀牛就要用牛刀……

不必global全局啊,单页模块内的全局变量就够了,所有新增、删除、判断用户登录关系都放在一个模块里处理

@hainee 如何用户多的活。存全局变量会不会有什么其它的影响?

你能有多少用户?你自己算算呗,一个用户会话关系记录占掉差不多1Kb吧,如果加上用户的其他信息,就算5Kb嘛,你有多少内存自己算一下呗,如果太多了,你就把用户信息存到memcache里面呗

第二项,我觉得如果存在关系,应该提示重复登录,不给登录比较好吧,强制剔除不太合理

一个用户用一个字节,然后不释放。于是,n个用户登陆,然后进程就内存溢出了。

不同浏览器 这种好像没必要吧?

回到顶部