java 怎样统计系统当前在线人数? 最简单的方法每登陆进来一个,就在application中维护的一个在线人数的计数+1。用户离线-1。判断用户离线就是设置多长时间没有请求就离线 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 利用session 每次用户登录会产生一个session 因为考虑到一台电脑多个浏览器之间session不共享也就是可能会形成这样一个概念,你的同一个用户名在服务器中打开了两个不同版本的浏览器因此保存了2个session,也就造成了不准确的因素所以你可以采用一张专门登录的数据库表格,字段不用多 保存登录的用户名就行,然后javaweb中有session的监听接口HttpSessionBindingListener,这个接口包含的两个方法分别会在每次因用户生成一个session触发,以及因用户正常注销session或非法超时服务器摧毁session后触发,我们要做的细化工作就是,当每个用户产生一次session时(登录操作),查找这张表格是否已有此账号的登录记录。有则在此登录表中不做增加操作,没有则增加该用户到次登录表。这样可以实现相对精准的登录人数,但对非法退出的用户,我想至今也没有一个好的想法,这种登录会多存在于服务器,知道服务器判定该session超时然后删除,该用户也就自动被删除登录表。 session的应用 监听器监听用户是否在线(1)写个java类package com.cwork.system;import com.cwork.system.user.User;import com.cwork.util.Pub;import java.util.Collections;import java.util.HashMap;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public final class SessionSnoop implements HttpSessionListener{ public static synchronized void increase(HttpServletRequest request, User user) { HttpSession session = request.getSession(); ServletContext ctx = session.getServletContext(); String sessionId = session.getId(); OnlineUser ou = new OnlineUser(session); if (user == null) { return; } ou.setUserName(user.getLogin()); ou.setName(user.getUserName()); ou.setIp(request.getRemoteAddr()); Object obj = ctx.getAttribute("session.snoop"); Map sess = null; if ((obj != null) && ((obj instanceof Map))) { sess = (Map)obj; if (!sess.containsKey(sessionId)) sess.put(sessionId, ou); } else { sess = Collections.synchronizedMap(new HashMap()); sess.put(sessionId, ou); } Pub.debug("session.snoop.count" + sess.size()); ctx.setAttribute("session.snoop", sess); } private synchronized void decrease(HttpSession session) { ServletContext ctx = session.getServletContext(); String sessionId = session.getId(); Object obj = ctx.getAttribute("session.snoop"); Map sess = null; if ((obj != null) && ((obj instanceof Map))) { sess = (Map)obj; if (sess.containsKey(sessionId)) sess.remove(sessionId); } } public void sessionCreated(HttpSessionEvent e) { } public void sessionDestroyed(HttpSessionEvent e) { HttpSession session = e.getSession(); decrease(session); }}(2)在web.xml配置 监听器 <listener> <listener-class>com.cwork.system.SessionSnoop</listener-class> </listener> <session-config> <session-timeout>30</session-timeout>//30分钟为session超时时间超过30分钟用户掉线 </session-config> (3)然后 在页面获取session值ServletContext context = session.getServletContext(); SessionSnoop.increase(request,currUser); Object obj=context.getAttribute("session.snoop"); Map count = null; OnlineUser user =null; /* if(obj != null && obj instanceof Map){ count=(Map)obj; Set set = count.keySet(); Iterator inerator = set.iterator(); while(inerator.hasNext()){ String name = (String)inerator.next();user = (OnlineUser)count.get(name); //count.remove(name); System.out.println(user.getName()); } System.out.println(count.size());(4)<script language="javascript"> var myTime = setTimeout("Timeout();", 5000); function resetTime() { clearTimeout(myTime); myTime = setTimeout('Timeout();', 5000); } function Timeout() { alert("用户已掉线"); document.location.href='login.jsp'; }document.documentElement.onkeydown=resetTime;document.doocumentElement.onclick=resetTime;</script>我只记录了登陆在线人数的重点部分,有点小复杂。基本和4楼说的差不多。希望能帮到你! 简单点的用application就可以了! 可以用application计算在线人数,比较好写,也可以用session的数量判断在线人数,相对复杂点,但也很简单 我们之前的项目也是使用心跳加4楼说的利用用户标识来统计的, 求解你们说的application是什么统计的, 是不是可以实现的更简单? 请教:这个我们每天必见的 Collections.sort 排序问题 运行struts问题? 我写了个程序就是在查询的时候,条件查询,连续点击查询按钮,它有时候出错,但是从新进界面去查又可以,怎么搞的?? 简单问题,帮的上忙的,一定有分. jsp使用struts1 标签后jquery不能使用$("")方式选中元素 通过CHECKBOX的点击事件控制一个按钮的状态?? 自定义tag时候的错误,帮忙看一看 这是什么错误?? resin和tomcat该选哪个? mybatis sql server 分页 java通信找不到串口
因为考虑到一台电脑多个浏览器之间session不共享也就是可能会形成这样一个概念,你的同一个用户名在服务器中打开了两个不同版本的浏览器因此保存了2个session,也就造成了不准确的因素
所以你可以采用一张专门登录的数据库表格,字段不用多 保存登录的用户名就行,然后javaweb中有session的监听接口HttpSessionBindingListener,这个接口包含的两个方法分别会在每次因用户生成一个session触发,以及因用户正常注销session或非法超时服务器摧毁session后触发,
我们要做的细化工作就是,当每个用户产生一次session时(登录操作),查找这张表格是否已有此账号的登录记录。有则在此登录表中不做增加操作,没有则增加该用户到次登录表。
这样可以实现相对精准的登录人数,但对非法退出的用户,我想至今也没有一个好的想法,这种登录会多存在于服务器,知道服务器判定该session超时然后删除,该用户也就自动被删除登录表。
(1)写个java类
package com.cwork.system;import com.cwork.system.user.User;
import com.cwork.util.Pub;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;public final class SessionSnoop
implements HttpSessionListener
{
public static synchronized void increase(HttpServletRequest request, User user)
{
HttpSession session = request.getSession();
ServletContext ctx = session.getServletContext();
String sessionId = session.getId();
OnlineUser ou = new OnlineUser(session);
if (user == null) {
return;
} ou.setUserName(user.getLogin());
ou.setName(user.getUserName());
ou.setIp(request.getRemoteAddr()); Object obj = ctx.getAttribute("session.snoop");
Map sess = null;
if ((obj != null) && ((obj instanceof Map))) {
sess = (Map)obj;
if (!sess.containsKey(sessionId))
sess.put(sessionId, ou);
} else {
sess = Collections.synchronizedMap(new HashMap());
sess.put(sessionId, ou);
} Pub.debug("session.snoop.count" + sess.size());
ctx.setAttribute("session.snoop", sess);
} private synchronized void decrease(HttpSession session) {
ServletContext ctx = session.getServletContext();
String sessionId = session.getId();
Object obj = ctx.getAttribute("session.snoop");
Map sess = null;
if ((obj != null) && ((obj instanceof Map))) {
sess = (Map)obj;
if (sess.containsKey(sessionId))
sess.remove(sessionId);
}
} public void sessionCreated(HttpSessionEvent e)
{
} public void sessionDestroyed(HttpSessionEvent e)
{
HttpSession session = e.getSession();
decrease(session);
}
}(2)在web.xml配置 监听器
<listener>
<listener-class>com.cwork.system.SessionSnoop</listener-class>
</listener>
<session-config>
<session-timeout>30</session-timeout>//30分钟为session超时时间超过30分钟用户掉线
</session-config> (3)然后 在页面获取session值ServletContext context = session.getServletContext();
SessionSnoop.increase(request,currUser);
Object obj=context.getAttribute("session.snoop"); Map count = null;
OnlineUser user =null;
/* if(obj != null && obj instanceof Map){
count=(Map)obj;
Set set = count.keySet();
Iterator inerator = set.iterator();
while(inerator.hasNext()){
String name = (String)inerator.next();
user = (OnlineUser)count.get(name);
//count.remove(name);
System.out.println(user.getName());
}
System.out.println(count.size());
(4)<script language="javascript"> var myTime = setTimeout("Timeout();", 5000); function resetTime()
{
clearTimeout(myTime);
myTime = setTimeout('Timeout();', 5000);
}
function Timeout()
{
alert("用户已掉线");
document.location.href='login.jsp';
}document.documentElement.onkeydown=resetTime;document.doocumentElement.onclick=resetTime;
</script>我只记录了登陆在线人数的重点部分,有点小复杂。基本和4楼说的差不多。希望能帮到你!