同⼀⽤户不同终端登录限制(附:同⼀浏览器不同⽤户登录解
决⽅案)
这本来是⼀个可有可⽆的问题,不过不保证客户是否会有这⽅⾯的需求。废话不多说,先来看同⼀⽤户不同终端限制登录的解决⽅法。
⽅法很简单,⼤致思路就是做出userId与sessionId(⼀个终端对应⼀个session域,session Id唯⼀)的键值对,存于全局域application域。⽤于登录时判断⽤户是否在别的终端在线。详细代码看图:
是不是觉得很简单,的确,实现⾮常容易,不过事情还没有结束。有存⼊就要有移除,不然关闭后就不能再登录了。当然,仅仅只做正常退出是的移除是不够的,现实中并不能保证所有⽤户都会乖乖的⾛你定下的退出流程。⼤多⽤户都是直接关闭浏览器了事,因此,这个事后处理还要由我们来做。
session和application的区别做法同样⾮常简单,我们来设置⼀下session域的监听。当有session域销毁的时候,做出移除application中相应键值对的操作,实现代码如下:
在l下设置监听,顺便设置session的time_out时间。
以下是监听的实现代码:
当然,⽤户点击logout正常退出时记得移除application中相应的键值对,代码这⾥就不贴了。
接下来,再来看看同⼀浏览器多⽤户登录的问题。这个问题很有意思,同⼀个浏览器意味着相同的session对象。做web的你相信对session意味着什么肯定是不陌⽣的。session⾥⾯存着当前⽤户的独有信息,不同的⽤户登录意味着上⼀个⽤户的信息将会被刷掉。因此⼤多⽹站的做法都是要么不处理,要么禁⽌不同⽤户在同⼀终端登录,要么当第⼆个⽤户登录后,第⼀个⽤户再登录被要求重新登录。
对于这个问题恰好昨天看到了学校的教务系统,没想到它居然实现了这⼀功能。观察它的url请求才发现它们屁股后⾯都跟着⼀个⼀段⼩尾巴***?
userId=###。没错,教务系统的服务器就是根据每个url请求的userId来区分⽤户的。⾄于session存储信息的⽅法,下⾯是我的设想,当然已经在我的项⽬上实现。由于代码量⼤⽆法贴出下⾯给出我的解决思路(以我此次项⽬为例):
1、⽤户登录成功,⽤户信息(我这⾥只存了⽤户名)存⼊session域中键值对字符串“userID”映射的⽤户List。
2、⽤户权限信息存⼊session域中键值对字符串“power”映射的权限Map,其中Map的key为⽤户名,value为权限信息。
3、作拦截userId为空的请求,转到登录页⾯。
如此,便可根据url传来的userId信息获得正确的⽤户信息实现同⼀浏览器多⽤户登录了。当然,这种⽅法没有特别要求的话博主是不推荐的。如果你有更好的办法,望不吝啬赐教。
最后,做⼀下“限制同⼀⽤户不能在不同终端上同时登录”功能与“不同浏览器登录同⼀⽤户”功能的冲突性分析:
同⼀浏览器登录不同⽤户:登录时不验证                          只使⽤session不使⽤application
不同浏览器登录同⼀⽤户:登录时验证sessionId-userId    application使⽤userSessionMap
⽆功能交叉,功能实现互不影响。放⼼⼤胆的⽤吧。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。