如题,我将前台的某个JSP页面(在框架里的一个隐藏的页面)设置为2分钟刷新一次(里面走java类,通过Weblogic访问数据库),但Weblogic的Session的失效时间为1个小时,这样的话,如果用户长时间不操作,由于实时刷新,Weblogic认为每两分钟都有操作,所以Session永远不会失效。我想得到最新的数据,但又不能满足用户的需要(长时间不操作,Session应该自动失效),我有什么办法吗?

解决方案 »

  1.   

    一般session失效时间定为2分钟(这里你可以根据需要来调整,比如说5分钟)
    页面刷新时间一般为6秒钟一次(一般聊天室的刷新就是4~6秒,在这里可以根据你自己的需要来调整比如说30秒刷一次),也就是说当你关闭你所有的网页2分种后,服务器端关于你的session就会消失,如果你不关闭网页原理上是永远都不会消失,这样你即可以做到实时,又可以让session消失,因为两分种时间差不是太大,所以感觉上是很实时的了。
      

  2.   

    Weblogic的Session的默认失效时间为1个小时,即当用户打开网页,1个小时不进行任何操作,Weblogic就将Session失效。但我的实时刷新操作会让Weblogic误解为用户一直在操作,所以永远都不失效,那就麻烦了.但你如果让Session在2-3分钟就失效那好像又不太合适,用户操作起来肯定不方便
      

  3.   

    噢,你明白你的意思了,你用一个session来存放用户的最后操作时间,也就是说每当用户操作一次(比如:浏览网页,埴报内容等页,凡事用户可以操作的页,你都写一段记录操作时间的代码,你可以写一个文件,然后用include包含进来),你就把他的操作时间放到这个session中,每当你那个页面刷新时先来判断,最后操作时间与当前时间的差是否超过规定的时间,如果超过,你就删除所有的该用户的session值,然后停止刷新该页,如果没有超过,就继续刷新就行了。注:你的那个刷新页中不要写记录最后操作时间的代码。
      

  4.   

    to bluemoon0001:不是你猜的那个意思,其实你不要管我刷新时进行了什么操作啊,我现在就是想达到我的要求。并且我刷新JSP时,JSP中访问了数据库,访问了SESSION,这些都是必须操作。有没有其他的办法?
      

  5.   

    记录最后3次(1小时/20分)操作发生的时间,每次操作时记录都刷新,刷新之前判断如果倒数第3次操作时间是在1小时之前,session就失效。
    不知是不是满足要求?
      

  6.   

    TO danjiewu(阿丹),那就麻烦了,每一个用户提交的操作地方都要进行记录,工作量很大啊我觉得可以实现,但不可行
      

  7.   

    使用HTTP长连接吧,可以实现实时数据传送,并且客户端断线可以立刻反应出来。
      

  8.   

    另外HTTP长连接并会影响SESSION,换句话说就是如果没有客户端的网页刷新,SESSION仍然会失效
      

  9.   

    记录用户的最后一次操作时间到session中,然后每次刷新判断一下是否超过了一个小时
      

  10.   

    楼主好好的看一下,我上面第二次说的内容吧,是用一个session变量来记录用户最后一次操作的时间,在你的那个刷新页面里,判断一下用户最后一次操作的时间(session中记录的)与当前时间的差是否大于你规定的超时时间,如果大于,停止刷新,并删除一切session值。
    至于记录每次操作的时间也不麻烦啊,你的网面中肯定有公用的文件对吧,比如说:head.jsp,等...,在这样的页面中,把用户的当前操作时间写到那个session中不就行了吗?这就是在聊天室中,多长时间不说话被自动踢出聊天室的原理,楼主好好的看一下吧。如果你不用这种方法,再也没有别的更好的方法了。
      

  11.   

    楼上的方法对付同时在线比较少的系统还可以,如果在线人数多些就不行了。还是HTTP长连接方式,或者叫服务器推技术实现比较的合适
      

  12.   

    to bluemoon0001:谢谢你的帮助,你说的这种方法肯定是可以实现的,但我的系统里面都是用的框架结构,基本上没有使用同一个JSP的情况。我会在仔细想想你提的这个思路的另外我考虑的一个情况是,用户进行操作,可能只是IE客户端执行一些脚本而已,在这种情况下也就不会倒服务器端了,也是个问题
      

  13.   

    to xlyyc(宇),你能给一点相关的资料吗 ,这个方法我没有用过,想研究一下按照你的意思,应该是能够实现的
      

  14.   

    将下面的代码插入到一个SERVLET的doGet方法中,他会每一秒钟向客户端发送当前的时间
        response.setContentType(CONTENT_TYPE);
        ServletOutputStream os = response.getOutputStream();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        while(true){
          try{
            String str = format.format(new java.util.Date());
            str = "<script>alert('"+str+"');</script>";
            byte[] pdu = str.getBytes();
            os.write(pdu);
            os.flush();
            logger.info(Thread.currentThread().getName()+"  发送 "+str);
            try{Thread.sleep(1000);} catch(InterruptedException ex){}
          }catch(IOException e){
            System.out.println(Thread.currentThread().getName()+"  客户端断开连接");
            break;
          }
        }
      

  15.   

    这个方法就是服务器推,并且对SESSION没有影响
      

  16.   

    用一个session记录上次的操作,(每次操作都记录操作的时间),然后在iframe自动刷新页里判断时间,如果有很长时间没动作,就用js关闭窗口