首页 > 编程知识 正文

单设备登录什么意思,单点登录管理系统

时间:2023-05-06 13:04:39 阅读:230985 作者:1692

首先我觉得很有必要说明一下单设备登录与单点登录的含义。我在网上搜索此类消息发现很多文章都误解了这两者的意思。

**单点登录:**英文Single Sign On,根据英文含义不难理解,即:单一标记(单点)登录。就是说,我只需要登录一次。例如:QQ,我在QQ空间登录一次,我可以去访问QQ产品的其他服务:QQ邮箱、腾讯新闻等,都能保证你的账户保持登录状态。

**单设备登录:**就是只能在一个设备上登录,若同时在其他设备登录,先前登录的用户会被提醒:该账户在其他设备登录。例如qq,小米手机登录中,同时拿华为手机登录该账户,小米手机的账户会被挤下线。

说清楚了这两者的区别,那来讲下我的思路吧。第一次做这个功能,并且是做的Java web端的功能。还请各位甜美的便当指点一二。美满的樱桃在此多谢了!

思路1:
1.添加Session监听器,把服务器产生的session,以sessionId与session作为映射关系保存在Map中。
2.保存用户与对应的session,以userCode与sessionId为映射关系保存在服务器缓存(Cache)中。
3.在用户登录时,根据用户code获取sessionId。
A:如果sessionId为空,则说明该用户还没有登录过,把此次登录的userCode与对应的sessionId保存到缓存中;并存入一个表示信息,isInvalid=0。表明此session有效;
B:否则,为第二次登录。然后把缓存中的上次登录保存的userCode及其对应的sessionId删除;再把此次登录状态信息保存到缓存中;
C:通过sessionId查询到上次登录的session,改变session中isInvalid状态为1,表明失效状态。
D:最后,过滤器中从session里面取出isInvalid字段,判断其是否有效。若有效则继续其他过滤;否则把isInvalid字段修改为2,表明这个session已经被处理过。然后通过转发,把此次请求转发给其他控制器处理。

当我按照上述思路做完代码,进行测试的时候。竟然成功了,还是很激动的。但是不久后发现了一个**问题:**在我在A端登录账号后,然后再B端登录。接下来我不在进行A端的账户操作,等到其session失效,我再进行操作,这个时候,先前的session中所存放的isInvalid标识已经不存在了。这个时候,过滤器是检测不到信息的。所以会被后续的过滤进行保持登录的代码所覆盖,然后重新登录进去。这个时候A端与B端同时操作是互相不影响的。

思路2:

借鉴网友:在用户表那儿添加多一个INT列,这个专门放随机数,每登陆一次,随机数就变化一次,并将随机数放在cookies或session中,每每读取和数据库的作对比,如果发现不对,就说明,别人己在另一个地方登陆了,这时就弹出“己在另一地方登陆”,然后关闭窗口,这样就行了。

这个思路我觉得可行,但是会频繁查询数据库,每一次请求都需要校验,然后就需要去与数据库里面的值进行对比校验。这个我觉得是可以避免的。

**我的想法:**我觉得可以把用户与对应的随机码存放在服务器缓存中(userCode==>UUID),并且把UUID存入cookies里面,之后的请求就包含该UUID。第二次登录的时候,再往缓存中放入userCode与UUID。这样就会覆盖先前存放的数据。如此,第一个登录的用户,再携带它的UUID去访问时,过滤器就会拿该UUID与缓存中的UUID进行对比。如果不一致,则说明其他设备登录了该账户。就提醒这个用户账号在其他设备登录即可。

我觉得这个方案是可行的,并且不用频繁的去操作数据库了,应该性能方面会有所提升。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。