1.写后台线程,心跳机制等判断用户是否在线。
2.利用session 每次用户登录会产生一个session
因为考虑到一台电脑多个浏览器之间session不共享也就是可能会形成这样一个概念,你的同一个用户名在服务器中打开了两个不同版本的浏览器因此保存了2个session,也就造成了不准确的因素
所以你可以采用一张专门登录的数据库表格,字段不用多 保存登录的用户名就行,然后javaweb中有session的监听接口HttpSessionBindingListener,这个接口包含的两个方法分别会在每次因用户生成一个session触发,以及因用户正常注销session或非法超时服务器摧毁session后触发,
我们要做的细化工作就是,当每个用户产生一次session时(登录操作),查找这张表格是否已有此账号的登录记录。有则在此登录表中不做增加操作,没有则增加该用户到次登录表。
这样可以实现相对精准的登录人数,但对非法退出的用户,我想至今也没有一个好的想法,这种登录会多存在于服务器,知道服务器判定该session超时然后删除,该用户也就自动被删除登录表。
4.可以用application计算在线人数,比较好写
5.session的销毁和创建是可以监听的。
在application容器中维护一个变量。当监听要session创建者加一反之减一
容器,不是窗口打错了
JavaWeb中的Session、SessionListener、在线人数统计
5.
测试环境:Tomcat 5.0.28
JavaWeb中的Session
SessionListener
应用:在线人数统计
import java.util.HashSet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 在application范围由一个HashSet集保存所有的session
HashSet sessions = (HashSet) application.getAttribute("sessions");
if (sessions == null) {
sessions = new HashSet();
application.setAttribute("sessions", sessions);
}
// 新创建的session均添加到HashSet集中
sessions.add(session);
// 可以在别处从application范围中取出sessions集合
// 然后使用sessions.size()获取当前活动的session数,即为“在线人数”
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
HashSet sessions = (HashSet) application.getAttribute("sessions");
// 销毁的session均从HashSet集中移除
sessions.remove(session);
}
}
怎样判断用户是否在线
原文:http://www.cnblogs.com/panxuejun/p/5958871.html