TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
因为自己以前确实认真想过这个问题,所以整理一下:
1.你需要用一个List、或一个数据表来保存每个用户在线信息:
jsessionid
ip
lasttime
...
aaaabbbbcccc
192.168.1.1
最后请求时间
xxxxyyyyzzzzz
192.168.1.2
最后请求时间
...
...
....
2. 接着你做一个Filter拦截所有用户请求。
每当有用户发送请求时,该Fitler将负责检查该用户的jsessionid,如果上面表中的已经包含了该请求的jsessionid
则表明该用户上次登录过,于是你就将该用户的lasttime列修改成当前时间,也就是最后一次发送请求的时间。
3. 然后你做一个Listener定期检查上面表中每条记录。至于多长时间检查一次,则取决于你的服务器设置。
比如每分钟检查一次,如果发现某jsessionid对应的lasttime和当前时间差超过指定时间(比如半个小时),
则表明该用户半个小时没有发送过请求,我们就将这条记录删除,也就是判断该用户已经离线。
这里自然有一个问题:可能有人会问,Web应用是否可以即时知道哪个用户离线呢?
答案是不能!因为HTTP协议本身就是不保持连接的协议,
当用户发送请求之后,服务器响应送到客户端之后,一次HTTP交互完成,
至于该用户是否立即离线,其实Web应用并不知道。
如果大家想在某个网站(比如疯狂java联盟)挂在线时间,那绝对不能像挂QQ一样,登录就不管它。
如果你只是登录页面但以后再也不管它,系统自动会在指定时间(半个小时?)后判断你已经退出了系统。
因此如果你想挂在线时间,那你应该每隔指定时间(比如28分钟)之前就刷新一次页面,也就是发送一次请求来欺骗服务器,这样服务器会一直判断你在线。 |
|