同一用户不同终端登录限制(附:同一浏览器不同用户登录解决方案)

    这本来是一个可有可无的问题,不过不保证客户是否会有这方面的需求。废话不多说,先来看同一用户不同终端限制登录的解决方法。

方法很简单,大致思路就是做出userId与sessionId(一个终端对应一个session域,session Id唯一)的键值对,存于全局域application域。用于登录时判断用户是否在别的终端在线。详细代码看图:

    是不是觉得很简单,的确,实现非常容易,不过事情还没有结束。有存入就要有移除,不然关闭后就不能再登录了。当然,仅仅只做正常退出是的移除是不够的,现实中并不能保证所有用户都会乖乖的走你定下的退出流程。大多用户都是直接关闭浏览器了事,因此,这个事后处理还要由我们来做。

    做法同样非常简单,我们来设置一下session域的监听。当有session域销毁的时候,做出移除application中相应键值对的操作,实现代码如下:

在web.xml下设置监听,顺便设置session的time_out时间。

    以下是监听的实现代码:


    当然,用户点击logout正常退出时记得移除application中相应的键值对,代码这里就不贴了。

    接下来,再来看看同一浏览器多用户登录的问题。这个问题很有意思,同一个浏览器意味着相同的session对象。做web的你相信对session意味着什么肯定是不陌生的。session里面存着当前用户的独有信息,不同的用户登录意味着上一个用户的信息将会被刷掉。因此大多网站的做法都是要么不处理,要么禁止不同用户在同一终端登录,要么当第二个用户登录后,第一个用户再登录被要求重新登录。

    对于这个问题恰好昨天看到了学校的教务系统,没想到它居然实现了这一功能。观察它的url请求才发现它们屁股后面都跟着一个一段小尾巴***.net?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
    无功能交叉,功能实现互不影响。放心大胆的用吧。

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值