jsp解决用户重复登陆。
正常退出的情况我会处理,就是当用户点击浏览器的关闭按钮时,怎么处理?如果用js来监视用户的关闭事件的话也有个问题,就是如果我当前用户登陆后开了两个网页,不能就关闭了一个窗口就让人家session失效吧 !怎么弄,请看清题目再回答!
高手,高手

解决方案 »

  1.   

    老生常谈,早有多种解决方案了。参考这里的两种解决方案:
    http://www.family168.com/tutorial/jsp/html/jsp-ch-08.html
      

  2.   


    1. session 有个侦听器 叫做:HttpSessionListener 它是一个接口,session,被创建和被销毁都是可以知道的。实力代码如下:
    public class MyHttpSessionListener implements HttpSessionListener {
        public void sessionCreated(HttpSessionEvent httpsessionevent) {
            //TODO do your business here
        }    public void sessionDestroyed(HttpSessionEvent httpsessionevent) {
            //TODO do your business here
        }
    }2. session是有过期时间的,比如30分钟不活动,自动销毁。你可以自己设置3. 你可以在数据库里面建一张表online_user,保存在线登录的用户。接下来 怎么做,你懂的,这话咱不用说得太细。
      

  3.   

    首先LZ不要激动。做软件的最重要的是耐心。关闭注销的功能不要。用户放到session里。简单点这么做就行了。
      

  4.   

    就如6楼说的,serlvet里有个监听器,可以直接监听session被创建跟销毁的时候做什么事
      

  5.   

    用户关闭浏览器时弹出窗口询问用户是否退出,如果是则销毁session,如果否则只关闭浏览器,至于用户打开多个浏览器的情况,你就不用多考虑,session有自己的生命周期,过一段时间会自动销毁。
      

  6.   

    这样可以在浏览器关闭做操作window.onbeforeunload=function(event){ 
      
    var isIEc = getOs();
    if(isIEc == "MSIE")
    {
      window.event.returnValue = "如果离开该页面,该页面的信息将会丢失。";  
    }else if(isIEc == "Firefox"){
      event.returnValue = "如果离开该页面,该页面的信息将会丢失。";  
      }
      }   
    window.onunload=function(){
      // 执行退出工作:后台把用户信息删除,把session中信息清除
      ExitAction();
      }function getOs() 

         var OsObject = ""; 
        if(navigator.userAgent.indexOf("MSIE")>0) { 
             return "MSIE"; 
        } 
        if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){ 
             return "Firefox"; 
        } 
        if(isSafari=navigator.userAgent.indexOf("Safari")>0) { 
             return "Safari"; 
        }  
        if(isCamino=navigator.userAgent.indexOf("Camino")>0){ 
             return "Camino"; 
        } 
        if(isMozilla=navigator.userAgent.indexOf("Gecko/")>0){ 
             return "Gecko"; 
        } 
       
    } function ExitAction() { var bigs = window.location.href;
    var name = ((bigs.split("//"))[1].split("/"))[0];
    url = "http://??????/????/ExitAction.do?";
    createXmlHttpRequest();
    var parameter = "noparameter";

    ///。发送等

    var isIEc = getOs();
    if(isIEc == "MSIE")
    {
    xmlhttp.open("post", url, true);
    xmlhttp.setrequestheader("content-length", parameter.length);
    xmlhttp.setrequestheader("cache-control", "no-cache");
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlhttp.onreadystatechange = function(){};
    xmlhttp.send(parameter);
    }else if(isIEc == "Firefox"){

    var ffurl = url + parameter;
    xmlhttp.open("post", ffurl, false);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.onload = function(){};
    xmlhttp.send(null);
    }
    }
      

  7.   

    即便是你写再多代码控制,就如你说,用户断电,客户端如何能够触发你的事件,我认为,这样只能在服务器端做文章,简单点做就是设置session 超时,麻烦点的话,应该服务器端监听客户端的响应事件,定时给客户端发送请求。
      

  8.   

     struts防止重复提交  http://www.phome.asia/forum/thread/16144.html
      

  9.   

    我再说详细点,我之前说的那个简单的做法,退出是靠长时间不发送请求到服务器,服务器端自动关闭session的。LZ各位也都提到了。如果LZ想做精确些,那可以在网页里用上Ajax技术,定期向服务器发送个消息,告诉服务器保持连接,服务器端如果间隔较长时间没收到这个消息则让该用户注销。至于你那个关闭网页就注销不要用,会引发的问题你也考虑到了,注销按钮也可以加上,不过这个应该是拿来做重登陆用的。
      

  10.   

    给lz补充点基础知识吧:网页访问的本质就是,服务器把这个网页内容发送给你的浏览器以后,就和它们再没有关系了。session是两边各有一个记录,下次客户端发请求时,连着自己这个信息发送过去,然后服务器端再认定你是之前用这个session的同一个用户,你客户端如果不主动往那边发信息,那边是不知道你这页面的情况的。所以LZ这样的,想让服务器端能知道网页这端行为的,只好用Ajax这种小间隔的消息往来流才能实现了。
      

  11.   

    我有这个这样的想法:(根据传奇的游戏想的,当然,我不知道他们是不是这样实现的 呵呵)首先用表  储存  字段为 seesionId  userid  isonlie
    登陆时,就记录一条信息。此外还要用过滤器来检查该用户的状态(用户防止多点登陆)
    如果发生意外,退出。 再次登陆时第一次时 提示 ”用户账号异常,被锁定,请重新登陆“ (此时修改下 isonlie的状态,其实就是T他下线)。      那么再次登陆就可以正常登陆了。
      

  12.   

    用AJXA,定时给后台发送段信息,当后台超过多少事件接受不到信息时,将session注销
      

  13.   


    那用Ajax的话,怎样定期的给服务器发送请求呢。?学习了
      

  14.   

    http://www.cnblogs.com/redfire0922/archive/2006/06/20/430746.htmljs的防止重复提交
      

  15.   


    23楼的方法不是很好嘛?B/S程序只能是客户端发送请求给服务端,服务端接受处理请求,只要你任意一个页面开着,这个Ajax就每隔1秒发送一个我还在浏览的信息到服务器,你关闭了窗口就不会发送了,这样即使你强行关闭浏览器,断电了,电脑被炸了,地震了。服务器过了超过1秒时间没有收到你的确认消息就自动注销你的session就是了。可以把登陆消息确认时间记在session中,写一个守护线程,每1秒检查一下session列表中,发现某一个超过时间没有确认就把他做了
      

  16.   

    回楼主:思路是这样的:用户登陆--->触发SESSIONLISTENER对象---->在SESSIONLISTENER对象先判断此SESSION的ID是否存在判断分支:存在时,跳过不保存此SESSION对象,不存在时,保存此SESSION对象。SESSIONLISTRNER运行结束---->过滤器运行并寻找SESSION是否是新创建的判断分支:不是新的,进入APPLICATION域中根据SESSION的ID从APPLICATION域中的MAP中找到对应的SESSION,并判断是否存在用户信息判断分支:如果用户存在,则跳过,如果用户为空,则跳转到登陆页面,或是对相应页面的功能不能使用。如果过滤器寻找的SESSION是新创建的,那证明用户又新打开了一个窗口,那么就根据原始的SESSION的ID从MAP中获取相应的用户信息,并把用户信息保存到现在的SESSION中,供现在的新窗口使用。过滤器执行完毕---->执行框架或是JS,JSP页面-->完.这样做能保证用户信息都是统一的,并且在用户关闭某一窗口,或者是停电等原因时,SESSIONLISTENER都能在第一时间销毁SESSION,如果用户重复登陆,我们只要判断SESSION中是否存在已有的ID,那么就能对重复登陆的用户进行阻挡或拒绝。
      

  17.   

    他想做实时的啊?
    那可真是吃力不讨好只能用ajax轮询来实现了,监听window.onunload是不稳定的,非法关机就根本找不到。只能在浏览器上开一个iframe, 隔个半分钟自动去服务器请求一次,服务器接收到请求就说明客户端还活着,否则就把客户踢出系统。问题是,什么情况需要这么实时????????????自找苦吃。
      

  18.   

    关闭浏览器session销毁,对应的Id没了,如果要做到重复登录,该是做出提示,用户是否退出
      

  19.   


    我那只是思路,不代表真这样,存储的信息不一定是SESSION的ID,也可以存其他东西,但是基本思路是这样的.........