你可以在关闭事件中用session.removeAttribute()方法来实现销毁

解决方案 »

  1.   

    这样的话,是不是服务器端才能释放session的值啊,也就是说客户端关闭后,服务器不能自动销毁session值。是吧?
      

  2.   

    另外,如何在服务器端查看客户端的session是否存在
      

  3.   

    session当然不会自动销毁,除非到期了!
    removeAttribute()方法只能删除会话中的属性不能而不能删除会话本身!
    先用getSession()得到会话后可调用invalidate()方法中止!
    如果客户关闭浏览器而不是正常注销,服务器无法发现这种情况!!!(jsp服务器其它的我不清楚)
    我知道可以用session.getID()来获取每个会话的唯一ID但得到这个唯一ID后怎样得到特定会话就不清楚了,如果可以获取特定会话就可以用一个servlet or ejb监控会话以便及时关闭会话了!
      

  4.   

    session不关闭也会自动到期,自动销毁
      

  5.   

    只要浏览器全部关闭,好像SESSION就会自动销毁的
      

  6.   

    回复人:wangser82(相思树) ( ) 信誉:100  2003-11-11 20:23:00  得分:0

    只要浏览器全部关闭,好像SESSION就会自动销毁的--这要看session的超时了.
    如果你在浏览器关闭时向服务器发送一段销毁的代码也可以.但执行的效果不理想
      

  7.   

    其实我的初衷是,当用户登录成功后,把session的生存周期设的长一些,免到用户登录30分钟后,就无法访问了。可是又怕设的时间太长,服务器那里不能自动销毁,这样访问的人多了,服务器会吃不消。我觉得‘王磊’说得有道理,可能需要人工的关闭才行,不知道大家谁有这方面的代码。比如在窗口关闭时,通过一个事件能够调用session.invalidate()销毁当前的session谢谢大家的参与!
      

  8.   

    在关掉ie的时候,服务器端的session并没有销毁。只需要写个实现HttpSessionListener接口的程序跟踪一下就会发现这个问题。
    没有什么好的办法来判断,在关闭本页面的时候,用户有没有打开同一应用的其它页面,也就不能在页面的onclose时间中做一个提交,在处理页面中调用session.invalidate。
    一个很笨的办法就是用Logout来代替,但并不是所有的用户都会点击这个按钮退出的。
      

  9.   

    结束session有三种情况,(1)会话超时(2)关闭流览器 (3)用session.invalidate()终止会话
      

  10.   

    由于http协议的非连续的,无链接的,离散的特点浏览器关闭并没有向服务器端发送任何信息,所以也就无从知道你是否关闭浏览器,当然也就不能随之关闭session了。热烈期待楼上 web_spider(蓦然回首,那人却在、灯火阑珊处。)的接口代码贴出来研究讨论
      

  11.   

    还有一个很色情的办法就是用色情网站上常用的方法,关闭该页后弹出另一页,在另一页里自动执行销毁session来代替手工销毁,然后自动关闭这个小的窗口。代码简单而实惠
      

  12.   

    一般session当用户登录网站时系统将自动生成一个独一的色素四哦那对象一旦用户退出网站那么该session对象将被注销.
      

  13.   

    (web_spider)分析的很透,希望有更好的建议,供大家参考。
      

  14.   

    下面的代码改写自我写的用来回收资源用的一段代码。
    怕泄漏公司秘密,不好意思,只能在其中加了一条打印语句,
    不过大家可以根据需要添加业务逻辑。import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;public class ClearUpServlet
        extends HttpServlet
        implements ServletContextListener, HttpSessionListener {
      //Notification that the web application is ready to process requests
      public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Start up the server");
      }  //Notification that the servlet context is about to be shut down
      public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Shut down the server");  }  //Notification that a session was created
      public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Newly created session:"+se.getSession().getId());  }  //Notification that a session was invalidated
      public void sessionDestroyed(HttpSessionEvent se) {
       System.out.println("The session:"+se.getSession().getId()+" will be destroyed");
       }
    }
      

  15.   

    web_spider说的很对啊。session是不会因为浏览器的关闭而销毁的,用楼上的例子就可以知道。在sessionDestroyed方法里可以调用getId来取得此session的ID。但是这个session已经不能再使用了。你在关闭浏览器后再打开浏览器,就会创建一个新的session,即使老的session还没有销毁,也是一样。
      

  16.   

    session不会因为浏览器的关闭而关闭的,因为http协议是发送请求返回请求的,你关闭浏览器并不向服务器发送请求!
      

  17.   

    楼上的代码只是用来监听session的建立和销毁用的。这样的代码经常被用来统计在线人数等。但并不能主动触发一个sesssion destroy事件啊。
      

  18.   

    其实上面的代码只是让大家可以跟踪session的创建和销毁的过程。上面是个监听事件,当然要有触发器了:,(1)会话超时(2)关闭流览器 (3)用session.invalidate()终止会话。
    其实上面的代码只是用来统计在线人数的化,我想Sun公司也就不用加这两个事件了。
    我现在用到的是:在destroy中除去临时、无用的资源(象临时文件,临时表中的数据可能并不能在用完之后就删除。像报表,可能生成很多页,你不知道什么时候在用那一页,此时在session destroy事件中删除就是一个不错的主意)。当然在服务器启动的时候,你可以在create事件中预先加载一些资源,进行一些初始化操作。我想合理利用这些事件,用处还是蛮大的
      

  19.   

    web_spider,我也是想问的是,你的destroy是不是在关闭浏览器时向服务器发送一个请求,用于销毁服务器端的session,要不服务器端并不知道客户端关没关闭。
      

  20.   

    另外,就是:
    “没有什么好的办法来判断,在关闭本页面的时候,用户有没有打开同一应用的其它页面,也就不能在页面的onclose时间中做一个提交,在处理页面中调用session.invalidate。“我们怎么处理这种情况?
      

  21.   

    我在Tomcat下面做的试验,结果是:
    当客户的浏览器关闭时,并不向服务器提交关闭请求,这样只能等到
    session自然超时的时候,Tomcat才清除该session相关的信息。
      

  22.   

    只要用户在页面进行了任何与服务器有交换信息的的动作,我就将之前的SESSION释放,并且再重建一个,而这些SESSION的周期我设的都比较短,也就是说,用户只要较长时间不做任何操作,那么我认为用户SESSION无效,只要在一定时间内开始操作,那么我认为用户有效
      

  23.   

    session会自动的关闭,有时间限制,这个可以自己设置,一般在web.xml中进行设置sessiond的timeout属性
      

  24.   

    tomcat默认的超时时间是30分钟,实际上时间不宜设置太短,如此用户老是被提示重新登陆,谁还会上你的网站啊?不知道csdn怎么做的,好像没有超时限制
      

  25.   

    如此用户老是被提示重新登陆,谁还会上你的网站啊?
    ============================================
    这话有理阿!
    看了半天,还是
    “还有一个很色情的办法就是用色情网站上常用的方法,关闭该页后弹出另一页,在另一页里自动执行销毁session来代替手工销毁,然后自动关闭这个小的窗口。代码简单而实惠”这个办法最有实际意义,不过客户端浏览器关闭后
    服务器端的SESSION真的没用了吗?
    在应用了COOKIE的网站里也是重新建SESSION而不是取回上一次连接的SESSION?
    如果是的话,那说明HTTP协议的安全性还是不错的
    否则~~
      

  26.   

    http://expert.csdn.net/Expert/topic/2574/2574685.xml?temp=.9251825不知道这个会不会给你点启发
      

  27.   

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;public class ClearUpServlet
        extends HttpServlet
        implements ServletContextListener, HttpSessionListener {
      //Notification that the web application is ready to process requests
      public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Start up the server");
      }  //Notification that the servlet context is about to be shut down
      public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Shut down the server");  }  //Notification that a session was created
      public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Newly created session:"+se.getSession().getId());  }  //Notification that a session was invalidated
      public void sessionDestroyed(HttpSessionEvent se) {
       System.out.println("The session:"+se.getSession().getId()+" will be destroyed");
       }
    }怎么用啊?在页面中调用吗?