关于非法退出如何处理?

robyjeffding 2009-06-17 12:58:18
加精
统计在线用户人数,用户一登陆,在线人数加一,注销时在线人数减一,如果用户直接把浏览器关了或者非法退出?
我如何才能知道?并且能够在他非法退出时,对应的在线人数减一,而不是用户已经退出了,在线人数却没有改变?
用了监听器来做处理,在sessionDestroyed方法定义:

public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();

// 取得登录的用户名
String username = (String) session.getAttribute("username");
List<String> users=(List) application.getAttribute("users");
users.remove(username);
System.out.println("非法退出,注销此用户:"+username);

}


在调用session.invalidate();会自动执行此方法,但如果我直接关闭浏览器,这个方法不会被执行!求救高手了!
...全文
643 102 打赏 收藏 转发到动态 举报
写回复
用AI写文章
102 条回复
切换为时间正序
请发表友善的回复…
发表回复
a181111979 2011-03-08
  • 打赏
  • 举报
回复
mark一下 每次来csdn都有收获
alixxj 2010-07-15
  • 打赏
  • 举报
回复
同意楼上的做法 我目前也是这样做的。 一年了 该结贴了
zfl2k 2010-06-28
  • 打赏
  • 举报
回复
我的做法:
主界面含一定时刷新页面,更新用户表里的最后操作时间,同时可检查是否有新消息等
在线用户根据用户表里的最后操作时间稍大于定时刷新时间的即可
比如30秒刷新一次,则最后操作时间在60秒内的均算在线用户。
taohuawuzhu 2010-06-25
  • 打赏
  • 举报
回复
这个问题原本就没必要做如此麻烦的处理,只要把非正常退出的因素全都做session超时处理就行了,只是在线人数的精确度滞后一个session超时的时间段而已,不过在线人数也不用那么精确吧
雨枫 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gordonkkk 的回复:]
可以用javascript做辅助,但不应该依赖它。如果人家直接结束进程,甚至PC直接断电,服务器又如何得知?
楼主你现在做的已经可以了。session会超时的,超时了就自动销毁了。
[/Quote]
另外就是js的话你怎么判断他是否关闭了全部的网页,如果都加上的话,很显然不可取的,session会自动销毁的。
shuiguozheng 2009-12-15
  • 打赏
  • 举报
回复
难解决!
wyasd456456 2009-12-14
  • 打赏
  • 举报
回复
看了半个小时,头都大了,问题却还没解决。。。。。。。。我靠!!
min123456520 2009-08-09
  • 打赏
  • 举报
回复
利用javascript监听窗体的关闭事件
numberOneJava 2009-08-09
  • 打赏
  • 举报
回复
哈哈。。。哈哈。。。。
robyjeffding 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 92 楼 yue_ch 的回复:]
这个现在还没有完美的解决方法。我试过用JS辅助实现的,能处理用户点击X关闭浏览器,Alt+F4关闭、Ctrl+W关闭、文件菜单项关闭。但是如果用户直接在地址栏中输入网址转到其它网站时,就没办法了
[/Quote]
感谢楼上回答!
yue_ch 2009-07-16
  • 打赏
  • 举报
回复
这个现在还没有完美的解决方法。我试过用JS辅助实现的,能处理用户点击X关闭浏览器,Alt+F4关闭、Ctrl+W关闭、文件菜单项关闭。但是如果用户直接在地址栏中输入网址转到其它网站时,就没办法了
robyjeffding 2009-07-16
  • 打赏
  • 举报
回复
再来顶一下!
robyjeffding 2009-07-13
  • 打赏
  • 举报
回复
79楼提供的方法试过了,在IE下可以执行,在firefox和傲游中不能执行,
应该是判断的问题:
if(event.clientX>document.body.clientWidth&&event.clientY <0||event.altKey||event.ctrlKey)
这个判断用在IE上可以,如果要兼容其他浏览器该如何写?
iskyshop 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 qiheia 的回复:]
用Session监听器,试下吧。将Session存活时间设短点。。。
一、实现Session监听器
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineCounter implements HttpSessionListener {

public synchronized void sessionCreated(HttpSessionEvent se){
String count = (String)se.getSession().getServletContext().getAttribute("count");
int …
[/Quote]
同意23楼提的方法,session不可能精确的跟踪,只有判断用户是否有新的请求来确定用户是否超时!
hui94781674 2009-07-09
  • 打赏
  • 举报
回复
学习了。。小明白了。
Jerry-He 2009-07-09
  • 打赏
  • 举报
回复
加个心跳程序,多少时间去连接服务器一次,修改最后连接时间,如果超过一定的时间没有更新,说明某个人已经下线了
robyjeffding 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 79 楼 vsfigo 的回复:]
//onunload() 和 beforunload() 都是浏览器刷新和关闭的事件,区别在于beforunload比onunload先执行
function window.onunload()
{
//这个IF用于判断是刷新还是关闭,如果是关闭就进入下面代码href去ACTION中请求销毁session对象
if(event.clientX>document.body.clientWidth&&event.clientY <0||event.altKey||event.ctrlKey)
{
var rightId = document.forms[0].elements("rightId").value;
self.…
[/Quote]
谢谢79楼,我会试一下的!
码YouMe 2009-07-09
  • 打赏
  • 举报
回复
俺是来学习滴。。。。
  • 打赏
  • 举报
回复

function onLine(){
createXMLHttpRequest();
var url = "servlet/innerCommManageServlet.do?action=onLine&userName=${employee.userName}";
xmlHttp.open("get",url,true);
xmlHttp.onreadystatechange = onMessage;
xmlHttp.send(null);
}

function onMessage(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){

}
}
}

window.onload =function(){
setInterval("onLine()",5000);
}

我以前好像做过这样的项目
  • 打赏
  • 举报
回复
在页面做定时刷新,setInterval();通过这个方法用ajax与后台进行通讯,如果后台接不到通讯内容就表示下线了,应该就比较容易控制了吧。。。
加载更多回复(82)

81,090

社区成员

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

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