javascript - 求助类似qq异地登陆,后一个登陆者挤掉前一个登陆者?
怪我咯
怪我咯 2017-04-11 10:39:41
[JavaScript讨论组]
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(6)
怪我咯

我们没用楼上说的ajax的轮询,而是用websocket,保持一个长链接。socket.io的实现。

每次用户连接上来,缓存他的登录信息,比如:uid、session、token、socketID的信息,然后,每一次下线(长链接断掉)就删掉相关的记录。

然后在他连接的时候根据他的uid和socketID来查找是否已经登录过了,从而执行相关的踢人逻辑,用之前存好的socketID,找到相应的socket,发送‘你被挤下线’的消息。
之所以要匹配socketID,因为有时候网络不稳定等因素,socket可以直接重连。

高洛峰

在系统中通过用户ID 与 session_id 维护一个关联, 再次登录时,把用户ID关联指向第二次用户登陆的session_id,并在第一次session添加一个异地登陆的标识

// 第一次登陆
session_id1  ==> {user:{用户信息}}
user_id      ==>  session_id1
// 第二次登陆
session_id2  ==> {user:{用户信息}}
user_id      ==>  session_id1
session_id1  ==> {user:{用户信息},other_login: true} // 第一次登陆用户刷新页面时提示异地登陆
巴扎黑

记录用户 session 就好的。
用网页的 session_id 作为网页的标识,在服务器记录用户当前的 session_id, 后登陆的替换这个 session_id, 之前的 session_id 查询服务器的时候发现 session_id 直接退出。

大家讲道理

有个简单的做法,登陆时,把本次登陆时间分别存到session和用户表里。每次操作前判断或用ajax定时获取,两个时间不一致就提示有其他登陆并退出。

PHPz
  socket.on('login',function(userobj){
        socket.name = userobj.temporaryId;   //用来disconnect的时候使用
        userobj.socketid = socket.id;
        var beforeSocketid = hadInUserList(userobj.userid);
        if(beforeSocketid){
            var disconnectSocket = server.sockets.sockets[beforeSocketid];
            disconnectSocket.emit('forceDisconnect'); //通知下线
        }
        onlineUserCount++;
        onlineUsers[userobj.temporaryId] = {userid:userobj.userid,username:userobj.username,socketid:socket.id};
        server.emit('login',{onlineUserCount:onlineUserCount,onlineUsers:onlineUsers,userobj:userobj});
        console.log(userobj.username + ' joined chat')
    });

分享一下我自己用nodejs socket.io写的一段吧。实际的代码,你可以当做伪代码看。客户端那边的操作就是断开链接弹出被挤下去的提示

大家讲道理

这个很简单,用户表里面存放一个 字段 last_login 登录成功随机生成一个值,分别存放到 session 和 这个字段里面,然后判断当前 session 里面的和 表里面的 last_login 字段是否匹配,不匹配则系统默认退出当前用户的登录状态

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号