牛骨文教育服务平台(让学习变的简单)
博文笔记

java web实现同一账号在不同浏览器不能同时登录

创建时间:2017-04-07 投稿人: 浏览次数:156
网上看了很多方法,个人也看了,自己也总结了几个比较常用的:

          前提都是用session监听器,对session的创建与销毁进行监听

      一、在用户登录时保存该用户的状态有这几种保存方式:

         1、保存到内存中(application ,servletcontext ,个人也是推荐这种方式)

         2、保存状态到数据库,至于具体的怎么保存你可以随意返回,如:0,1两种状态

         3、保存到文件中,对文件的读写

         以上是登录用户的状态,这对于大家来说都没有什么问题。   

     二、 这时如果同一用户登录了,你可以在登录成功后(保存信息之前)进入到上面的状态 中进行匹配判断,如果存在就提醒此用户你的账号已登录。 

     三、关键在于该用户的销毁

             invliate(),调用这个方法,通过Session的监听器,进行对当前用户的删除。

             Session过期,也会调用Session监听器。       

             讨论最多的就是在比如用户没有自己去注销session.invalidate()方法,而是直接关闭了 浏览器,这时怎么办?(浏览器关闭半个小时候,默认注销session,监听器这时才调用sessionDestroyed方法)。

             首先要明确的一点,用户关闭浏览器,服务器端是无法得知的(因为web客户浏览器与服务器之间是无状态的),网上也有一些解决方案,比如通过js来判断用户是否关闭了浏览器,是的次方法可行,但是如果用户操作时,打开了多个窗口呢,这里也有方法:

             1、一个方法还是比较好的,通过cokkie保存当前用户开了的页面数,如果页数为一的话,就可以触发js的注销Session了。

             2、先把Session的生命期设置的短一点,用类似ajax这种异步请求方式周期不断的去请求后台,这样可以保证当前的这个Session有效,如果用户退出后,该Session也会很快的过期。          

            上面的两种方式都有些缺陷,如:

            1、用户删除cokkie的话,就无法判断准确,这种可能应该不多吧(在访问当前网站时)

            2、有延迟,服务器压力相对来说比较大

           还有一种方式与上面的思考角度不一样(当然也要看需求了),如果有用户登录时,就注销之前已登录的同一用户。

           实现方式与上面应该是差不多的,唯一不同之处在于,不用去刻意的想办法让用户退出了(注销Session)。       

      四、虽然像百度,CSDN等这些网站都没有这样做,当然也没有必要这要这样做。

但是在我们做企业内部应用的时候有时候可能会要求我们这样做(同一账号在统一时间只能在一个登录),下面是个例子

我们先定义两个Map对象需要用到,存放用户与HttpSession的关系和sessionId与用户的关系。用来记录当前登录的用户是否登录和当前session是否已经绑定了登录用户。

 
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。