java 不同意同一账户不同IP 同一时候登录系统解决的方法 兼容IE Firefox

需求就是 不同意同一个账户同一时间登录系统。仅仅要有一个账户在线其它人就是不能用这个账户。


功能非常easy,过程非常纠结 。



这篇文章攻克了兼容IE、Firefox 浏览器下,不同IP 地址 同一用户同一时候登陆的解决的方法,包含应对浏览器没有正常关闭的情况。


说下解决过程,本来以为用session存取就好了,后来仅仅能在同一个浏览器内标签窗体好用。跨浏览器就不行。由于sessionId不一样。(经測试 跟sessionID 没关系 )


网上找了一些解决的方法。又是些监听器 又是写 方法的; 又是数据库加字段推断状态的。 。。。。都没用 。。。如今反倒认为 太复杂了 ,全然不是必需。


由于真的遇到了断电情况,数据库的字段就没办法改动状态了,直接Pass掉。至于关闭窗体的“X” 而不是选择了“退出”button这个功能能够通过JS 控制。轻松解决。


实现方法: 在action 中 加入静态变量 map 数组存储 登录的用户信息 ,先推断是否存在该用户信息的记录情况,有该用户信息就不让 登录了,没有加入到map。就这么简单。


第二个所谓的难点呢 就是假设浏览器选择了“X”button 而不是退出button。须要在页面加入JS 辅助 进后台 清理session 缓存 和 map 数据信息;触发退出方法清理session信息和Map 内的该用户信息。

(本地浏览器有3种,chrome /ie /firefox ; ie/firefox 已解决关闭窗体的“X” 功能;chrome 还未找到解决的方法,chrome 碰到的问题就是 用户登录进来之后 首先运行了以下的js 进后台清空session 信息 然后竟然又登录进来了。ie一開始也这样。后来加了ie浏览器推断就攻克了。假设高人看到了这篇文章,欢迎指点一二)。



$(window).bind('beforeunload',function(){

     var isIE = /msid/i.test(navigator.userAgent) && !window.opera;

   if(isIE){

             var n = window.event.screenX - window.screenLeft;

            var b = n > document.documentElement.scrollWidth -20;

            if(window.event.clientX >360 && window.event.clientY < 0 || window.event.altKey){

                 //关闭事件


                    $.ajax({

                           url :"exitLogin.action", //后台action,清理掉session 数据

                           type:"post",

                          success:function(){

                                alert("您已退出登录");

}

        });


}else{

               //是刷新事件

}

 }else{   //firefox

 

                      $.ajax({

                           url :"exitLogin.action", //后台action,清理掉session 数据

                           type:"post",

                          success:function(){

                                alert("您已退出登录");

}

        });

}


});


最后由于session 超时的话 map 没有进行清理。用户登录的时候先要去map 中批对 信息,这样就没办法登录了。 所以再在 页面上加个定时器 。定时清理一下map 中的数据就能够了。






原文地址:https://www.cnblogs.com/blfshiye/p/4042381.html