csdn就没高手吗?csdn没落了吗?一个简单session问题都没人知道?

terryhuang 2007-07-28 08:34:05
就是关闭页面时,关闭session的问题。
现要在关闭页面的时候将"用户在线表"中的状态改成"不在线"
我要在jsp页面关闭时清空session,
不清空的话,"用户在线表"总显示在线状态,就不能再登录了
网上查了下发现几种方法不太好
1.利用onunload事件弹出一个新窗口来关闭session.
弊端:一些客户端IE设置会阻止弹出窗口,刷新好像也会运行onunload事件
2.要在关闭网站最后一个窗口时才关闭session
忘大虾能给出完美解决方案,最好有列子或源代码参考~
谢谢了啊~
明天要再解决不了,经理非把我T了不可~
在线等~急急~
3.希望方法能适用于所有浏览器
4.本网站要求session超时为30分钟
5.cookie客户端可能会关闭
6. 要能解决 启动任务管理器,选中IE进程,强制终了,关机,拔电源等等物理手段
也要能清空session
7.不能让客户在关ie后再等30分钟登录,要能马上重新登录
...全文
2017 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
KulaDiamond 2007-08-30
  • 打赏
  • 举报
回复
页面中放入一个 iframe 3分钟刷新一次向 服务器发一次请求, 服务器session过期时间为5分钟,或者使用ajax 3分钟发一次请求

意外关闭的话,服务器5分钟session清空,用户离线
rokre2 2007-08-30
  • 打赏
  • 举报
回复
利用onunload事件(弹出一个新窗口)来关闭session.
弹出新的窗口,可以用ajax来实现.
bs客户,你不跟服务器发送消息,服务器怎么知道你是不是注销了

我觉得在关闭窗口里面清空session,没有意义,刷新实际上也关闭窗口.

APOLLO_TS 2007-08-30
  • 打赏
  • 举报
回复
2.要在关闭网站最后一个窗口时才关闭session

??最头疼

怎么识别是这个网站的信息呢!!都怪自己平时不用功,忘了!
APOLLO_TS 2007-08-30
  • 打赏
  • 举报
回复
前天客户提要求了,反和SESSION相关的东西都PASS,服务器经常崩。
还有Static声明的东西pass。
context--pass!

--------------------------------------擦擦脸先!!
function closeAllSubWin(mainWin) {
var subWins = null;
try {
subWins = mainWin.gSubWindow;
} catch (e) {

}

if(subWins == null) {
return;
}

var wins = new Array();
var winCnt = 0;
var subWinCnt = subWins.length;
for (var j = 0; j < subWinCnt; j++) {
winCnt = wins.length;
wins[winCnt] = subWins[j];
wins = getSubWins(subWins[j], wins);
}


winCnt = wins.length;
for (var i = winCnt - 1; i >= 0; i--) {
if (wins[i] != null) {
try {
wins[i].close();
} catch (e) {

}
}
}
}


function getSubWins(win, wins) {
var subWins = null;
try {
subWins = win.gSubWindow;
} catch (e) {

}
if (subWins == null) {
return wins;
}
var subWinCnt = subWins.length;
for (var i = 0; i < subWinCnt; i++) {
var winCnt = wins.length;
wins[winCnt] = subWins[i];
wins = getSubWins(subWins[i], wins);
}
return wins;
}

现要在关闭页面的时候将"用户在线表"中的状态改成"不在线"
AJAX 更新方法最好!
Session 可以形成请求列表,到时候可以删除列表中的东西。

登陆后
HttpSession apSession = (HttpSession) application.getAttribute(request.getRemoteAddr());
boolean bolIsLogin = false;
if (apSession != null) {
try {
apSession.setAttribute("dumy", "");
bolIsLogin = true;
} catch (Exception e) {
application.removeAttribute(request.getRemoteAddr());
}
}
列表堆栈整不了,你在想办法!
重定向js
var url = "<%= request.getContextPath()%>/login.jsp";
var target = "LoginWindow_" + new Date().getTime();
var htmlControl = "menubar=no, location=no, toolbar=no, scrollbars=yes, resizable=yes, status=no";
openWin = window.open(url, target, htmlControl);
openWin.focus();
top.opener = null;
window.close();
resizeToMax(openWin.self);
} catch (e) {}
hjk426 2007-08-30
  • 打赏
  • 举报
回复
1. 刷新,不论是要采用框架刷新或者ajax异步刷新.
2. socket连接
terryhuang 2007-08-30
  • 打赏
  • 举报
回复
3年了,唉都没找到答案,偶真的没脸再干下去了!
孟子E章 2007-08-01
  • 打赏
  • 举报
回复
在不禁止js功能的情况下,使用定时器,可以在10秒内,甚至5秒内清楚。
如果全部的功能都禁止了,你的页面其它功能也就不存在了,也就谈不上这个问题了。

MyDream83 2007-08-01
  • 打赏
  • 举报
回复
2.要在关闭网站最后一个窗口时才关闭session

-----------------------------

没一个人提出这个的解决办法
jr_zhang 2007-08-01
  • 打赏
  • 举报
回复
经理会就让他教教你,年轻人,你要明白一件事,

咱打工,是咱养公司,不是公司养你!

咱为钱外还为学技术!

不行来我们公司吧,专门培养新人,有高手带!^_^ 哈哈

看看下面这个或许对你有所帮助:
http://www.fish888.com/session-t121958
jr_zhang 2007-08-01
  • 打赏
  • 举报
回复

---------------------------------------
明天要再解决不了,经理非把我T了不可~
---------------------------------------

不会就问经理啊,经理他说不会就没理由把你T了

^_^
terryhuang 2007-08-01
  • 打赏
  • 举报
回复
我是说要那些只知道session.invalidate()的人多思考,就这么简单,我也不会发帖了!
lilome 2007-08-01
  • 打赏
  • 举报
回复
别指望session.invalidate();了
terryhuang 2007-08-01
  • 打赏
  • 举报
回复
session.invalidate();
-------------------------------------
思考,思考,再思考!!!
terryhuang 2007-08-01
  • 打赏
  • 举报
回复
楼主的要求是用户离开该web能尽快修改客户状态
-----------------------
是的。将"用户在线表"中的状态改成"不在线"
lilome 2007-08-01
  • 打赏
  • 举报
回复
其实关键问题不在于使Session过期,楼主的要求是用户离开该web能尽快修改客户状态。
1.客户需要定时访问web(这个js就能实现)
2.在服器端建立一张所有客户的列表,维护客户信息,用户上一次访问的时间
在filter中更新这个时间属性,如果长时间不更新,就认为客户已经离开了。
terryhuang 2007-08-01
  • 打赏
  • 举报
回复
to:kingofvc(不停学习)

想不到完美解决方案 还觉得你的要求得继续增加一项:
那就是关闭浏览器的时候,你得判断用户有没有开着其他的窗口,用户有没有用多种浏览器同时在访问,如果你在关闭浏览器就让session失效,那么用户会很郁闷,因为他只是关了一个页面而已。
-----------------------------------------------------
看我第2条要求:2.要在关闭网站最后一个窗口时才关闭session
terryhuang 2007-08-01
  • 打赏
  • 举报
回复
to:hornbilltofy()
既然是这么"简单",你自己怎么解决不了?
---------------------------------------------------
搞这个题目是激将大家踊跃答题,能找到高手,找到好方法,可惜~~
terryhuang 2007-08-01
  • 打赏
  • 举报
回复
先bs一下楼主理由同楼上诸位,外加bs楼主发完帖子就不出现了

解决办法 支持楼上某位说的 用js定时发信号
服务器在一定时间收不到客户端发过来的信号,就销毁session
这个方法可行

如果把session设为2分钟 然后js每一分钟发送一次信号应该也可以吧
这样也不用在服务器端写程序了
这样应该可以吧
求验证
------------------------------------------------------------
不是我不出现,是至今没发现有什么好办法,你没看清楚我的系统session超时必须为30分钟吗?
kjah 2007-08-01
  • 打赏
  • 举报
回复
js定时器就是指setInterval()吧
如果楼主的session一定要设置成30分钟的话,服务端就需要自己写
程序来维护一个在线用户列表,并销毁超时session。
大概的思路及各环节要点:页面js用类似setInterval(function1,30*1000)
这样定时执行一个函数,函数通过XMLHttpRequest或者iframe来调用一个处理jsp
这个jsp或者servlet主要是向一个在线用户列表中记录客户端最后一次联络的时间
这样服务端还需要一个线程来定时维护在线用户列表:清除过期的session、改变用户
在线状态,这个定时任务可以用Quartz来完成。

这样就解决了各种退出办法都可以销毁session的目的,但是像楼上某位说得太
消耗资源了,不过现在的服务器配置都那么高只要访问量不是特别大的情况下也
没啥问题。还请各位高人指点~
liubinwyzbt 2007-08-01
  • 打赏
  • 举报
回复
关于这个问题我曾此冥思苦想。但最终还是不能做完美。就我个人来认为。这问题在中国暂时还没有一个尽如意的答案。如果代码。请至邮: liubinan@yahoo.com.cn
加载更多回复(37)

81,094

社区成员

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

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