记录系统的用户的登录日志(登录时间,登出时间,用户信息等)

yimiyan 2013-11-13 07:10:57
系统架构:ssh
服务器:weblogic
用户会通过一个链接访问程序的一个action,进入到系统界面。现在要监控登陆这个页面的用户(登录时间,登出时间,用户信息等)。我目前的做法是在这个action中把用户的登录时间,用户信息存到数据库的online表中,将online表的主键放在session中。当用户关闭浏览器或者是通过系统的退出按钮之后,通过onunload监控使用ajax,执行一个action,在session中取的online表额主键,更新online表,插入登出时间。
在统计端,我需要统计8:00-20:00每个整点的在线人数大概如图这个样子的。每个整点的在线人数判断方法是,在整点这个时刻之前登陆,在整点这个时刻之后登出或者还没有登出的,就认为改用户在这个整点时是在线的。

但是目前存在的问题:
1,用户如果刷新界面,就会认为第一次登陆已经结束,然后又重新在数据库里面插入了一条数据。因为,刷新页面,又一次的执行了进入系统的action。
2,如果服务器端发生故障,或者其他原因,导致ajax的action没有执行或者执行不陈宫,那这个用户的登出时间就一直未空,那统计的时候,该用户就一直在线了。求解决方案。
有朋友说用心跳神马的,如果有懂的朋友,劳烦说的具体一点,对这个心跳真的是知之甚少啊?具体这个心跳要怎么配置神马之类的。^_^
...全文
16239 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yimiyan 2014-07-03
  • 打赏
  • 举报
回复
引用 11 楼 leijianweihai 的回复:
求获取浏览器关闭事件源代码。
这个只能获取到IE的。其他浏览器获取不到
 //关闭浏览器时才会触发此操作,刷新页面不执行
 //n 检测鼠标相对于用户屏幕的水平位置 - 网页正文部分左:求出鼠标在当前窗口上的水平位置(参照:当前窗口右上角为0、0坐标) 
 //m 网页正文全文宽 20这个值是指关闭按钮的宽度
 //b=false,鼠标在当前窗口内   水平坐标
 //b= true;鼠标在当前窗口外     水平坐标
 //y 垂直坐标 y>0鼠标在当前窗口内  ;y<0 鼠标在当前窗口外
 //window.event.altKey  当alt键按下时,值为 TRUE ,否则为 FALSE 。只读。 
 function onunload_handler(){ 
	// IE6 浏览器执行 判断当前浏览器版本 begin
	 if (window.ActiveXObject) {
   		var ua = navigator.userAgent.toLowerCase();
   		var ie=ua.match(/msie ([\d.]+)/)[1]
   		if(ie==6.0){
   		    if(window.event.clientX <= 0 || window.event.clientY <=0){
   		     $.ajax({
				   type: "POST",
				   url: "${ctx}/monitor/closeBrowser.do",
				   async:false,
				   success: function(){
					  
				   }
				});
   			}else {            
   		        //刷新
   		    }
   		}
	}
	// IE6 浏览器执行 判断当前浏览器版本 end
	  var n = window.event.screenX - window.screenLeft;
	  var m = document.documentElement.scrollWidth-20;
	  var b = n > m;
	  var y = window.event.clientY;
	  //关闭而非刷新
	  if (b && y < 0 || window.event.altKey)
	    {
	    	 $.ajax({
				   type: "POST",
				   url: "${ctx}/monitor/closeBrowser.do",
				   async:false,
				   success: function(){
					  
				   }
				});
	    }
	
 }  
 //点击登出按钮
 function closeWindows(){
	 $.ajax({
		   type: "POST",
		   url: "${ctx}/monitor/closeBrowser.do",
		   async:false,
		   success: function(){
			  
		   }
		});
	 window.close();
 }
David851101 2014-04-24
  • 打赏
  • 举报
回复
求获取浏览器关闭事件源代码。
yimiyan 2013-12-17
  • 打赏
  • 举报
回复
新项目还要做在线人数统计,不过新项目打算用心跳来做了
yimiyan 2013-12-17
  • 打赏
  • 举报
回复
我们最后还是用的这个设计。最后只取中心,区部,团队都不为空的情况。贴一下sql.
SELECT *
  FROM (SELECT E.CENTERNAME,
               E.AREANAME,
               E.TEAMNAME,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 8 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       8 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS EIGHT,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 9 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       9 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS NINE,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 10 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       10 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS TEN,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 11 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       11 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS ELEVEN,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 12 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       12 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS TWELVE,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 13 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       13 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS THIRTEEN,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 14 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       14 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS FOURTEEN,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 15 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       15 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS FIFTEEN,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 16 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       16 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS SIXTEEN,
                (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 17 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       17 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS SEVENTEEN,
                (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 18 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       18 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS EIGHTEEN,
               (SELECT COUNT(1)
                  FROM EKBS_ONLINE O
                 WHERE O.TEAMNAME = E.TEAMNAME
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND '0' <> NVL(O.AREANAME, '0')
                   AND '0' <> NVL(O.TEAMNAME, '0')
                   AND LOGINDATE = TRUNC(SYSDATE)
                   AND 19 > TO_NUMBER(TO_CHAR(LOGINONTIME, 'hh24'))
                   AND ('0' = NVL(TO_CHAR(O.LOGINOUTTIME, 'hh24'), '0') OR
                       19 <= TO_NUMBER(TO_CHAR(LOGINOUTTIME, 'hh24')))) AS NINETEEN,
               ('-') AS TWENTY
          FROM EKBS_ONLINE E
         WHERE LOGINDATE = TRUNC(SYSDATE)
           AND '0' <> NVL(E.TEAMNAME, '0')
           AND '0' <> NVL(E.AREANAME, '0')
           AND '0' <> NVL(E.CENTERNAME, '0')
         GROUP BY E.TEAMNAME, E.AREANAME, E.CENTERNAME
         ORDER BY E.TEAMNAME)
 WHERE ROWNUM <= 100
青柠loft 2013-11-26
  • 打赏
  • 举报
回复
同求解答~!帮顶一下
翘班党 2013-11-20
  • 打赏
  • 举报
回复
引用 2 楼 defonds 的回复:
最好还是用心跳机制。
学习了
yimiyan 2013-11-20
  • 打赏
  • 举报
回复
自己顶一下!我想具体了解一下这个心跳是肿么跳的,有知道的朋友可以聊一下啊!
yimiyan 2013-11-15
  • 打赏
  • 举报
回复
引用 2 楼 defonds 的回复:
最好还是用心跳机制。
嗯。也有朋友推荐了说用心跳。可是网上查了一些资料,不知道怎么用!能说的详细一点吗!或者有链接什么的可以给一个吗,参考参考
不怎么迷糊 2013-11-14
  • 打赏
  • 举报
回复
session的话 ,浏览器打开会有一个令牌,除非关闭浏览 否则始终是这个令牌,可以用这个判断,当然切换用户令牌是会改变的
Defonds 2013-11-14
  • 打赏
  • 举报
回复
心跳是为了判断当前连接是否有效,可被使用。如果可以及时的判断出当前连接已经失效了,就可以准确断定该用户已经下线。这种办法相对来讲还是比较靠谱点的。但是也有一定性能代价,client 比较小,服务器端会较大。
Defonds 2013-11-14
  • 打赏
  • 举报
回复
最好还是用心跳机制。
最勇敢的鸟 2013-11-14
  • 打赏
  • 举报
回复
第一个问题好解决,在struts拦截器中设缓存例如20分钟,如果缓存中没有数据,说明是第一次登录,插入数据表,如果有数据说明用户已经记录过了。用户每次访问任何页面或者刷新页面都重置缓存时间。
(1)用户登录模块:系统用户输入员工编号、密码、图片验证码进行登录 (2)个人中心模块:仓库管理员和仓库员工能够修改个人信息(姓名、性别、出生日期、邮箱等),修改头像,修改登录密码,接收和回复消息,退出系统。在接收和回复消息中,系统用户之间能够实现文字对话、上传文件、消息提示三个功能。 (3)基础信息模块:分为供应商信息管理(包含名称、地址、联系人、联系电话等)。客户信息管理(包含名称、地址、联系人、联系电话等)、仓库信息管理(包含仓库编号、位置、面积、可用状态、备注等)、库存信息管理(包含货物名称、类型、数量、状态、价格、描述等)四个模块,可以对四种信息进行增删改查。并且都增加一个批量导入、导出功能,能够将系统中的四种信息导入到一个excel表中;通过excel表格填写信息后直接导入到系统中。查询功能可以根据不同属性进行查询。导入做不了,只能手动录入的 (4)库存管理模块 (5)货物管理模块 (6)人员管理模块 (7)系统管理模块:包含系统日志模块、登录日志模块。系统日志模块记录用户进行的操作以及时间(操作包含:增删改基础信息、出库、入库、盘点等)。登录日志模块记录用户登录登出系统
易通电脑锁多用户控制版 v1.8.7.3更新: 完美兼容Windows 8.1。 强加强制隐藏文件功能。 易通电脑锁软件简介 易通电脑锁(多用户控制)一款优秀的分用户控制上网时间和控制电脑使用时间的软件。软件可创建多个用户,可为不同用户设置不同的时间控制管理策略,可按时间段和累计使用时间等方式来控制使用时间。可记录每个用户的开关机时间和使用时间记录文件(夹)的新建/复制/移动/删除等所有相关操作。软件每次运行后会将屏幕锁定起来,并进入软件登陆界面,等待用户登陆,登陆后根据登陆用户类型采用不同的控制策略。它具有非常灵活的时间控制管理功能,各种时间控制方式随意组合,做到了真正意义上的随心所欲的时间控制管理。 易通电脑锁软件主要功能 强大的软件用户管理功能 可随意创建多个不同类型的用户。软件用户分管理、普通、受限三类用户,管理用户具有最高的软件管理权限,可为不同受限用户制定不同的时间控制管理策略,各用户之间互不影响。      灵活的时间分段控制功能 时间分段控制功能提供了7 X 24小时的时间控制表,可以精确到半小时的时间片段。管理用户可以为指定的受限用户随意设置每天电脑使用时间和上网时间段,在这里提供了电脑正常使用状态、禁止上网状态、电脑锁定状态、电脑关机状态共四种电脑状态供用户选择。     全面的累计时间控制功能 累计时间控制功能提供了每天、每周、每月三种累计时间控制方案。您可以根据您需求设置使用电脑的总时间或上网总时间,当设置的累计时间使用完后,计算机将处于选择的状态。在这里提供了禁止上网状态、电脑锁定状态、电脑关机状态共三种电脑状态供用户选择。 贴心的定时时间控制功能 您可以通过本功能来实现每连续使用一段时间计算机后,就强制锁定一段时间计算机,以达到强制休息一段时间的目的, 从而保护使用者的眼睛和身体健康。 方便的使用期限控制功能 您可以通过本功能来控制用户只能在指定的时间内才能登陆,超过指定的时间将禁止用户登陆。控制方式有两种,请根据您的具体要求选择设置。 详细的日志记录查询功能 提供了系统日志和磁盘日志两种日志用户查看分析。系统日志记录计算机开机、注销、重启、待机、关机、每次开机总时间、软件登陆/登出系统事件。磁盘日志可以让你方便详细地了解到计算机系统的文件操作情况。磁盘日志记录文件(夹)的新建/复制/移动/删除等所有相关操作,还记录了磁盘的插入或拔除操作。   易通电脑锁软件已经过360、金山等当前主流安全软件安全认证

81,094

社区成员

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

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