张恒_ZH
2018-09-26 03:47
采纳率: 81.8%
浏览 3.9k
已结题

一个账号只能在一处登陆,不是单点登陆。

怎样实现一个用户只能在一处登陆,账号A 在 机器A登陆,当账号A重新在机器B上登陆时,后台向机器A上的账号A发送一条消息“你已在机器B上登陆”,然后注销机器A上的账号A。

这里有两个问题需要解决:
1、一个账号只能在一处登陆
2、怎样通知被被注销的用户

  • 点赞
  • 收藏

5条回答 默认 最新

  • blownewbee 2018-09-26 03:58
    已采纳

    一个机器怎么定义的,一个物理计算机,一个物理计算机上的不同虚拟机,一个物理机上相同虚拟机的不同浏览器,还是相同浏览器的不同实例。
    如果你不十分苛求物理计算机,你可以通过session判断,每次登录成功把 sessionid 存入数据库的表。
    通过轮询,判断当前sessionid是否和数据库里的相同,可以知道自己是不是那个登录地点的实例。
    可以把登录时间也记录下来,实现后者踢掉前者。
    如果不喜欢轮询,可以用websocket服务器实时发通知,给之前的客户端。客户端跳转到登录页面或者提示用户。

    点赞 评论
  • llll2020 2018-09-26 09:11

    很简单的举个例子 拿手机来说 每个手机都有物理id 比如terminalId(唯一标识该设备)你登录的时候上传该id给后台 登录成功 后台会将你的账号和这个terminalId绑定 也就是和你的设备绑定了。当你用其他的设备登录成功后,后台会把你的terminalId换成现在登录的设备,你之前的设备在请求时候后台就会给出对应的错误码:该账号已被其他设备登录xx的,这时候你需要重新登录 后台重新绑定这个设备才可以正常用(急需C币 望采纳)

    点赞 3 评论
  • ladfkjsoj 2018-09-26 05:11

    一个账户登录后记录下来, 返回一个随机码,然后记录下这个用户及随机码,用户做操作都带上这个随机码。
    当用户操作的判断随机码已经不是当前最新的随机码,则通知用户已经在其他地方登录

    点赞 2 评论
  • 疯狂的熊猫Npe 2018-09-26 05:31

    单点登录分移动端和PC端的,我只做过移动端,说一下我的实现方式吧:

    1.在用户登录时,不管第三方登录还是普通的登录方式我们都会去获取用户登录设备的唯一deviceToken将其保存在用户表中,用户每次登录时我会根据用
    户登录的手机号码或者用户如果是第三方登录就通过第三方登录表和用户表进行关联获得该用户最后一次设备登录的deviceToken进行验证,如果
    if(StringUtils.isNotBlank(user.getDeviceToken) && !user.getDeviceToken().equals(deviceToken))
    {
    // 这个判断也就是说如果该登录用户表中deviceToken不等于空(也就是说已经登录过了),并且当前登录设备的deviceToken和登录用户表中存在的deviceToken不相等,到了这里就相当于你这个账号已经登录过了,但却是在多台设备登录,在这里可以提醒前面一台登录设备 “您的账号在别处登录,
    请重新登录了 ”
    }

    点赞 评论
  • 疯狂的熊猫Npe 2018-09-26 05:39

    像你说的消息推送可以通过友盟推送(百度就行了)来实现,很简单的,你使用单播消息推送到指定设备上就行了,就跟上面一样,你将当前登录用户表中
    的deviceToken取出来进行推送就行了,这时候你还只是在校验该账号是否在多处出登录,还没有将当前登录信息保存至用户表中,楼主可以先试试看,我
    用自己这种方法写出来的没有问题,哪怕用户意外退出(删软件,系统升级,刷机)都不会影响单点登录的实现。

    点赞 评论

相关推荐 更多相似问题