xl_echo编辑整理,欢迎转载,转载请声明文章来源。更多IT、编程案例、资料请联系QQ:1280023003
百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!
单点登录,踢出实现,一碰到,感觉蒙圈了。
一哥们跟我讲,如果同一个账号,在一个地方登录之后,怎么保证有其他地方登录就踢出这个的登录。一问之后,我的第一反映就是我们可以使用用户ID来进行控制啊,但反应过来才发现不是每一个公司都会为用户表建立用户ID的。所以然后那哥们给我提示了一下,他说用IP啊,瞬间蒙了,感觉IP控制是个好牛B的东西,没做过。
这里主要讲一下上面这个需求的实现方案:
方案一:
说一种比较原始的,使用Application来实现控制。(注意:用户名不能重复,注册前做异步校验)
Application用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart事件(global.asax)中完成.尽管使用Application.Lock和Applicaiton.Unlock方法来避免写操作的同步,但是它串行化了对Application对象的请求,当网站访问量大的时候会产生严重的性能瓶颈.因此最好不要用此对象保存大的数据集合
Application是基于服务器的,服务启动之后就会创建一个该对象,并且服务器只会创建一个。所以我们就可以使它来存储信息。
获取Application对象方法(Servlet中):
ServletContext app01 = this.getServletContext();
app01.setAttribute("name", "kaixuan"); //设置一个值进去
ServletContext app02 = this.getServletContext();
app02.getAttribute("name"); //获取键值对
由于Application存储在服务器,所以你每一次登录都可以先调用方法获取到用户的信息,如果存在用户信息,证明已经登录了,直接将之前的用户信息删除即可,再次去登录,如果不存在就没有登录,允许登录。
方案二:
使用CAS来保证唯一登录
每次在CAS服务端登录成功时记录当前登录帐号(唯一)(List)。每次登录操作之前,验证当前登录帐号是否存在缓存中,如果存在就去找CAS的ticket缓存(我是直接用的CAS的缓存机制,有心人可以自己封装缓存信息),然后遍历缓存找到当前用户匹配的ticket,找到后执行ticket过期操作,同时在缓存中删除当前ticket。
详细操作参考:https://blog.csdn.net/ii_bat/article/details/53213252
现在实现这一类操作的方案有很多,这里仅提供以上两种,有感兴趣的朋友可以补充哦!