我现在的思路是这样的 每个用户登陆之后都会session.setAttribute("user",user); 后面那个user对象存放的就是登陆用户的信息 监听器的 AttributeAdd()方法中 外面创建一个共有的属性 map来存放session信息 user的ID 为键 session为值 此时判断map.get(user.getId())是否为空 不为空 就说明 当前用户已经登陆 将之前的属性移除 然后讲新的session信息存入 map中 AttributeRemove()方法中 获得要删除的session 将他从map中移除 AttributeReplace()中 得到旧的信息 从map中移除 并对新session进行上面判断 看是否重新登陆 并存入map中 现在问题就用户不可能都是点退出登陆的方式来退出的 , 有很多是直接关闭浏览器的方式来结束的 ,而关闭浏览器的话 session是不会直接被销毁的 也就是说通过监听的 sessiondestrory()方法是无法进行监听的 所以map就无法实时更新 求高手帮助!!! 或者通过其他的技术来实现 刚开始学 大多数技术不太熟悉 通常要实现我上面的功能在企业中都是如何实现的
看下这个网站吧,对你有用
http://www.ibm.com/developerworks/cn/web/wa-cometjava/index.html
session.removeAttribute( "FormName ");
//消除session
session.invalidate();
中的ValueBound 和valueUnBonud方法即可
2: 定义 在线用户容器
Lz 的思路虽好,但就像他自己说的那样,要用户关掉浏览器的时候是行不通的_ 外加一句,当用户反浏览器关掉时session是会销毁的.但是还存在你 Map 中!
package com.eatsun.vo.power;import java.util.ArrayList;
import java.util.Date;
import java.util.List;import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;import com.eatsun.beans.OnLineUserContainer;
import com.eatsun.vo.companyframe.PowerUserPermitVo;
import com.eatsun.vo.hrmanager.HrMessageVo;
import com.googlecode.jsonplugin.annotations.JSON;/**
*
* @author tangyong [email protected] 09-07-07
* @version 1.0
*
*/public class UserVo implements HttpSessionBindingListener { private OnLineUserContainer onLineUserContainer = OnLineUserContainer
.getInstance(); /* 添加到session时调用 的方法 */
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("executing...add...");
// onLineUserContainer.addUser(this);
addUser(this);
} /* sessoin失效or 移出session调用的方法 */
public void valueUnbound(HttpSessionBindingEvent event) { onLineUserContainer.removeUser(this);
} private void addUser(UserVo addedUser) { if (onLineUserContainer != null
&& onLineUserContainer.getUserVector() != null
&& onLineUserContainer.getUserVector().size() > 0) { for (int i = 0; i < onLineUserContainer.getUserVector().size(); i++) { UserVo vo = onLineUserContainer.getUserVector().get(i); if (vo.getUserId().equals(addedUser.getUserId())) { onLineUserContainer.getUserVector().remove(i);
}
}
}
onLineUserContainer.getUserVector().add(addedUser);
}}
-------------------------------------------------------package com.eatsun.beans;import java.util.ArrayList;
import java.util.List;
import java.util.Vector;import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;import com.eatsun.model.PowerUser;
import com.eatsun.vo.power.UserVo;/**
*
* @author [email protected]
*
* <p>
* 在线用户容器类 用来存当前在线的用户集合
* </p>
*
*/
public class OnLineUserContainer { private static final OnLineUserContainer onLineUserContainer = new OnLineUserContainer(); private Vector<UserVo> userVector; private OnLineUserContainer() {
userVector = new Vector<UserVo>();
} public static OnLineUserContainer getInstance() { return onLineUserContainer;
} public void addUser(UserVo userVo) {
if (userVo != null) {
userVector.add(userVo);
}
} public void removeUser(UserVo userInteger) { if (userInteger != null) {
userVector.remove(userInteger);
}
} public Vector<UserVo> getUserVector() { return userVector;
}}
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>点叉号触发</title>
</head>
<script type="text/javascript">
window.onbeforeunload = function(){
//here,you can do what you want to do!
return "温馨提示,您确定要退出页面吗?";
}
</script>
<body><div align="center" style="margin:100px;">点右上角的关闭,会有新发现。
</div>
</body>
</html>
做软件讲究的是用最简单的办法去处理问题,而不是让问题更复杂话.用ajax 照你那么说当然可以 在客户端浏览器中 写function
setTimeOut(functionName,时间周期);在服务端保存 sessionId .客户端定时发送信息过去。就像 你上班打卡一样.如果发现多长时间他没打卡[浏览器关闭了 or 其它情况] 这样。说明当前用户就不在线了。