java 怎样统计系统当前在线人数?

坚持住521 2014-02-24 03:36:58
求大神帮助啊?统计系统当前在线人数
...全文
6402 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员小董 2016-04-21
  • 打赏
  • 举报
回复
参考自jeecg package org.jeecgframework.web.system.manager; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.jeecgframework.core.util.ContextHolderUtils; import org.jeecgframework.web.system.pojo.base.Client; /** * 对在线用户的管理 * @author JueYue * @date 2013-9-28 * @version 1.0 */ public class ClientManager { private static ClientManager instance = new ClientManager(); private ClientManager(){ } public static ClientManager getInstance(){ return instance; } private Map<String,Client> map = new HashMap<String, Client>(); /** * * @param sessionId * @param client */ public void addClinet(String sessionId,Client client){ map.put(sessionId, client); } /** * sessionId */ public void removeClinet(String sessionId){ map.remove(sessionId); } /** * * @param sessionId * @return */ public Client getClient(String sessionId){ return map.get(sessionId); } /** * * @return */ public Client getClient(){ return map.get(ContextHolderUtils.getSession().getId()); } /** * * @return */ public Collection<Client> getAllClient(){ return map.values(); } }
bcsflilong 2016-04-21
  • 打赏
  • 举报
回复
application中放一个量
l_o_v_e_p_c_ 2015-05-13
  • 打赏
  • 举报
回复
doPost方法里面加一个?
坛子成长记 2015-05-09
  • 打赏
  • 举报
回复
监听Session。数量就存到。application/ServletContext中
乔不思 2015-04-27
  • 打赏
  • 举报
回复
application的话,如果项目在一个服务器上跑的话,能满足要求。。。也就只有这种情况下能满足要求, 感觉沙发说的心跳机制可行,思想可以借鉴, 1.在服务端开启线程专门维护 在线人数,定时向 客户端发送请求,当然客户端也得有一个在线线程一直跑着,服务端发送给客户端,客户端响应服务端。这个可以。。。但是不好。 2.客户端开启线程定时主动请求服务端,服务端统计在线情况。。然后服务端轮询在线的列表,观察最新的请求时间,(如果客户端设置的是 30秒请求一次,那么服务端在判断时候,考虑到网络延迟),如果距离上次请求时间已经过了50秒,那么就设置成下线,当然这个时间是瞎说的。。。也就表达意思。
用手敲过才算 2015-04-27
  • 打赏
  • 举报
回复
HttpSessionBindingListener来监听session状态
洋洋2018 2015-04-27
  • 打赏
  • 举报
回复
引用 13 楼 a20023930 的回复:
session的销毁和创建是可以监听的。 在application窗口中维护一个变量。当监听要session创建者加一反之减一
容器,不是窗口打错了
洋洋2018 2015-04-27
  • 打赏
  • 举报
回复
session的销毁和创建是可以监听的。 在application窗口中维护一个变量。当监听要session创建者加一反之减一
qq_16211725 2015-04-25
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
建议使用 51.la
残阳依旧 2014-02-25
  • 打赏
  • 举报
回复
我们之前的项目也是使用心跳加4楼说的利用用户标识来统计的, 求解你们说的application是什么统计的, 是不是可以实现的更简单?
skywalker22 2014-02-25
  • 打赏
  • 举报
回复
可以用application计算在线人数,比较好写,也可以用session的数量判断在线人数,相对复杂点,但也很简单
-江沐风- 2014-02-24
  • 打赏
  • 举报
回复
简单点的用application就可以了!
异常异长 2014-02-24
  • 打赏
  • 举报
回复
应该是多线程监听
凡人_0520 2014-02-24
  • 打赏
  • 举报
回复
application
itzgs 2014-02-24
  • 打赏
  • 举报
回复
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楼说的差不多。希望能帮到你!
s041738 2014-02-24
  • 打赏
  • 举报
回复
利用session 每次用户登录会产生一个session 因为考虑到一台电脑多个浏览器之间session不共享也就是可能会形成这样一个概念,你的同一个用户名在服务器中打开了两个不同版本的浏览器因此保存了2个session,也就造成了不准确的因素 所以你可以采用一张专门登录的数据库表格,字段不用多 保存登录的用户名就行,然后javaweb中有session的监听接口HttpSessionBindingListener,这个接口包含的两个方法分别会在每次因用户生成一个session触发,以及因用户正常注销session或非法超时服务器摧毁session后触发, 我们要做的细化工作就是,当每个用户产生一次session时(登录操作),查找这张表格是否已有此账号的登录记录。有则在此登录表中不做增加操作,没有则增加该用户到次登录表。 这样可以实现相对精准的登录人数,但对非法退出的用户,我想至今也没有一个好的想法,这种登录会多存在于服务器,知道服务器判定该session超时然后删除,该用户也就自动被删除登录表。
teemai 2014-02-24
  • 打赏
  • 举报
回复
最简单的方法每登陆进来一个,就在application中维护的一个在线人数的计数+1。 用户离线-1。 判断用户离线就是设置多长时间没有请求就离线
Defonds 2014-02-24
  • 打赏
  • 举报
回复
维护各容器,有用户登录,增加数据; 写后台线程,心跳机制等判断用户是否在线。
卡卡吉利 2014-02-24
  • 打赏
  • 举报
回复
每个用户有一个状态,持续收到请求显示在线,一段时间没收到离线,统计在线人数

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧