我的毕设是做一个类似于facebook的网站,在开发时遇到一个棘手的问题,如在用户登录时会在服务器端写入一个session记录用户的信息,于此同时会将登陆着的信息对象装入到服务器的链表里,用于观看哪些用户在线,当用户关闭窗口时可以触发一个js函数,让服务器端的session销毁,同时把用户信息从链表中删除,这个时候就知道该用户已不在线,但是问题在于我登陆账号后,打开多个页面,此时这多个页面里持有着同一个session,而当我关闭其中一个页面时,session便失效,如何做到在关闭最后一个网页才后触发js函数,使得session销毁,链表删除该用户信息

解决方案 »

  1.   

    这个像你那么设计只要关闭就摧毁session,当然会像你说的那个情况了。
    我不知道你的facebook是什么意思,但是我感觉你不应该自己摧毁session,你那个没有购物车吗?
    有的话,你的购物车不放在session中吗?session没了,购物车不也没了吗???我不知道你怎么实现的。
    但是我感觉你可以让session钝化然后等待服务器去摧毁这样也不占用资源
      

  2.   

    哇,facebook是现在国外最流行的交友网站,跟微博一样!国内禁了,蛮想去玩玩那个东西的,听说挺牛的!而且这个网站的搜索引擎好像跟百度谷歌一样牛x!
      

  3.   

    我觉的应该由客服端 通过ajax定时给服务端发送信息。。 表示他在线。。用struts2 action的一个方法提供页面访问,参数为用户id 和sessionid
    用一个map<String,Date> 类型来存储当前在线用户 key存储用户id value存储最新更新时间
    当用户访问用struts 对应的在线方法时候。 先判断map里面是否存有对应用户id 不存在则加入。。时间为当前时间。 存在的话,将时间改成当前时间就好。。
      用一个定时器来判断 当前时间 跟map里面所有用户在线更新时间做对比。。 如果超出一定时间长度 则认为离线了。。 这时候可以通过sessionid 让益处session.. 同时移除userid对应的的map记录
      

  4.   

    对啊!我就是希望达到那种关闭所有窗口才会让session无效的效果,问题在于如何监听到当前还有那些页面持有同样的session,同时还能对此作出判断的方式。
      

  5.   

    补充一下,我之前确实想过这个方式,给session设定一个周期,时间到了就自动销毁,但是感觉这样不是特别精确,如果登陆了两秒就下线,服务器端依然认为session是存在的,所以该用户依旧显示在线。但事实上他已经下线了
      

  6.   

    我ajax还没接触,你的方法听起来不错,我今天尝试一下,谢谢你了,同时也感谢其他热心的网友
      

  7.   

    用jquery封装的ajax就一个方法 很简单的。。
    -------------------------------------------补充一下,我之前确实想过这个方式,给session设定一个周期,时间到了就自动销毁,但是感觉这样不是特别精确,如果登陆了两秒就下线,服务器端依然认为session是存在的,所以该用户依旧显示在线。但事实上他已经下线了你设置timeout为10秒不就行了。。 据我所知qq也是这样来判断是否掉线的。。  你可以用两个qq测试下非正常关闭一个qq,另外一个是不是要等几秒才能看到对方离线。。
      

  8.   

    对啊!我就是希望达到那种关闭所有窗口才会让session无效的效果,问题在于如何监听到当前还有那些页面持有同样的session,同时还能对此作出判断的方式。
    ==============================================================================
    你写个ajax访问后台的方法  然后封装到js文件里面。。  每个在线页面都是都调用这个js文件。。
      

  9.   

    干嘛不把这些session中的数据放到application中呢 做个监听器当用户退出时销毁对应的session并移除application中对应的session数据。