日期:2014-05-19  浏览次数:20655 次

浏览器关闭让其他用户知道我的离线状态
各位高手们 本人现在有个特别棘手的问题 需要各位高手帮忙 就是当点击关闭浏览器后 让其他用户的页面刷新也可以看到该用户已退出该系统 并将该状态该为离线。。。。
能附上代码 更好 谢谢。。。。。。。

------解决方案--------------------
数据库设计中 对每个用户设置在线状态字段 根据状态进行页面显示用户在线离线
------解决方案--------------------
即时性好的话 就用socket 采用多线程的方式 将与该人关联的好友存在一个集合里 当他下线时 发送给当前集合中的用户每个人一个信息

不要求即时性的话 可以重写session拦截器 当session失效时发给指定用户一些信息
------解决方案--------------------
我想可以这样,当session被释放的时候,更新当前用户的在线状态,当前其它用户刷新后,可以看到该用户已退出该系统

------解决方案--------------------
用长连接 推技术 (polling)
------解决方案--------------------
探讨

用长连接 推技术 (polling)

------解决方案--------------------

关闭浏览器服务器应该不能确定用户已退出话,也只能等session过期才能确定用户已经断开连接。
除非用户点击退出系统,然后后台作处理才能实时更新状态
对于浏览器异常关闭,只能等session过期,然后写个监听器,当session过期时做一些操作,
下面这个是我以前毕业设计里写的监听器
package com.hisoft.util;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import com.hisoft.action.UserAction;
import com.hisoft.model.User;

public class MyListener implements HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent se) {
if ("user".equals(se.getName())) {
UserAction.count++;
User user = (User) se.getValue();
System.out.println(user.getName() + " has login");
UserAction.onLineUser.add(user.getName());
System.out.println(UserAction.onLineUser.size());
}
}

public void attributeRemoved(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
if ("user".equals(se.getName())) {
User user = (User) se.getValue();
System.out.println(user.getName() + " has logout");
UserAction.onLineUser.remove(user.getName());
System.out.println(UserAction.onLineUser.size());
UserAction.count--;
}
}

public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub

}

}