如何让同一个账号只能在一个连接上登陆?
发布于 1 年前 作者 liangdas 1068 次浏览 来自 分享

w 我发现同一个账号可以同时登陆,也就是说不能做到互斥,比如账号A在S1机器上登陆了,当在S2的机器登陆就会把S1踢下来。目前我找了半天没有发现直接的办法。在Login模块session管理的时候只是管理当前的session,这个没有办法实现我说的功能 q 你搞一个单独的模块来管理用户信息,比如用一个redis保存每一个userId的session信息,login模块在鉴权时先查一下这个userdid是否已经存在了,如果存在就把那个链接关了

你不是要保证一个userid只能有一个session吗?那你就得在绑定新的userid之前把旧的session关了啊

q 每个用户登录时候,绑定userid之前去redis查一下有没有这个userid的值,如果有就代表已经有sessoin登录了,那么就可以先关闭,如果没有就对这个session进行绑定,同时把这个session存到redis里面,key就是userid

关闭了就是把上一个链接换了,然后把新的替换进去就行

注: gate.Session这个结构体有一个序列化函数和反序列化函数 序列化函数: 结构图—>byte[] 反序列化函数: byte[]–>gate.Session 因此gate.Session就可以被保持到数据库中

6 回复

完成

@liangdas 最近几天没看到有新的更新啊。半个月前的那次更新包括了这个优化? 只是给你一个实现思路,框架不会来做这种东西

看了下你的源码,session中有个方法是IsConnect参数是userid。可以获取到此Userid的session的链接状态。 你可以添加 个方法,通过userid设置原session断开链接,或者是可以通过userid查找到session,然后再对session进行操作。 就没有必要非要把session序列化后存在redis里了。

@wzhs 你要考虑分布式环境

gate.Session 有一个Serializable 方法, 请问反序列话 函数在哪?

session序列化与反序列化 http://www.mqant.com/topic/5a6555249ed0a52e7fee6ccf 提问题前可以先在论坛顶部搜索一下关键词

回到顶部