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

记录系统的用户的登录日志(登录时间,登出时间,用户信息等)
系统架构:ssh
服务器:weblogic
用户会通过一个链接访问程序的一个action,进入到系统界面。现在要监控登陆这个页面的用户(登录时间,登出时间,用户信息等)。我目前的做法是在这个action中把用户的登录时间,用户信息存到数据库的online表中,将online表的主键放在session中。当用户关闭浏览器或者是通过系统的退出按钮之后,通过onunload监控使用ajax,执行一个action,在session中取的online表额主键,更新online表,插入登出时间。
在统计端,我需要统计8:00-20:00每个整点的在线人数大概如图这个样子的。每个整点的在线人数判断方法是,在整点这个时刻之前登陆,在整点这个时刻之后登出或者还没有登出的,就认为改用户在这个整点时是在线的。
记录系统的用户的登录日志(登录时间,登出时间,用户信息等)解决方法
但是目前存在的问题:
1,用户如果刷新界面,就会认为第一次登陆已经结束,然后又重新在数据库里面插入了一条数据。因为,刷新页面,又一次的执行了进入系统的action。
2,如果服务器端发生故障,或者其他原因,导致ajax的action没有执行或者执行不陈宫,那这个用户的登出时间就一直未空,那统计的时候,该用户就一直在线了。求解决方案。
有朋友说用心跳神马的,如果有懂的朋友,劳烦说的具体一点,对这个心跳真的是知之甚少啊?具体这个心跳要怎么配置神马之类的。^_^ 
------解决方案--------------------
第一个问题好解决,在struts拦截器中设缓存例如20分钟,如果缓存中没有数据,说明是第一次登录,插入数据表,如果有数据说明用户已经记录过了。用户每次访问任何页面或者刷新页面都重置缓存时间。
------解决方案--------------------
最好还是用心跳机制。
------解决方案--------------------
心跳是为了判断当前连接是否有效,可被使用。如果可以及时的判断出当前连接已经失效了,就可以准确断定该用户已经下线。这种办法相对来讲还是比较靠谱点的。但是也有一定性能代价,client 比较小,服务器端会较大。
------解决方案--------------------
session的话 ,浏览器打开会有一个令牌,除非关闭浏览 否则始终是这个令牌,可以用这个判断,当然切换用户令牌是会改变的