import java.util.LinkedList;
import java.util.List;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
* java统计用户在线状态
* @author sunlightcs
* 2011-6-26
* http://hi.juziku.com/sunlightcs/
*/
public class OnLineUserListener implements HttpSessionAttributeListener {
/**
* 存放在线用户列表
*/
public static List<Integer> onLineUserList = new LinkedList<Integer>();
/**
* 根据用户ID,查询用户是否在线
* @param userId 用户ID
* @return true:表示用户在线 false:表示用户离线
*/
public static boolean findUserOnLine(Integer userId){
return onLineUserList.contains(userId);
}
/**
* 用户登录时候,把用户的信息存到userSession里
* UserSession类的结构很简单,只有userId,userName两个属性
*/
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
if ("userSession".equals(se.getName())){
/**
* 用户上线的话,把用户的ID,添加到onLineUserList里
*/
Integer userId = ((UserSession)se.getValue()).getUserId();
onLineUserList.add(userId);
System.out.println("用户ID:"+userId + " 上线了。。。");
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
if ("userSession".equals(se.getName())){
/**
* 用户下线的话,把用户的ID,从onLineUserList中移除
*/
Integer userId = ((UserSession)se.getValue()).getUserId();
onLineUserList.remove(userId);
System.out.println("用户ID:"+userId + " 下线了。。。");
}
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
}
}
监听器的代码写好后,就要把加这类加到web.xml文件里,这样才可以达到监听的作用。
web.xml里,加入的代码如下:
<!-- 监听用户状态 在线或离线 -->
<listener>
<listener-class>com.xxx.util.OnLineUserListener</listener-class>
</listener>
<!--设置会话过期时间为10分钟 如果不设置,默认是30分钟-->
<session-config>
<session-timeout>10</session-timeout>
</session-config>