首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

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

2012-02-17 
csdn就没高手吗?csdn没落了吗?一个简单session问题都没人知道?就是关闭页面时,关闭session的问题。现要在关

csdn就没高手吗?csdn没落了吗?一个简单session问题都没人知道?
就是关闭页面时,关闭session的问题。
现要在关闭页面的时候将 "用户在线表 "中的状态改成 "不在线 "
我要在jsp页面关闭时清空session,
不清空的话, "用户在线表 "总显示在线状态,就不能再登录了
网上查了下发现几种方法不太好
1.利用onunload事件弹出一个新窗口来关闭session.
弊端:一些客户端IE设置会阻止弹出窗口,刷新好像也会运行onunload事件
2.要在关闭网站最后一个窗口时才关闭session
忘大虾能给出完美解决方案,最好有列子或源代码参考~
谢谢了啊~
明天要再解决不了,经理非把我T了不可~
在线等~急急~
3.希望方法能适用于所有浏览器
4.本网站要求session超时为30分钟
5.cookie客户端可能会关闭
6.   要能解决   启动任务管理器,选中IE进程,强制终了,关机,拔电源等等物理手段
    也要能清空session
7.不能让客户在关ie后再等30分钟登录,要能马上重新登录

[解决办法]
up
[解决办法]
不怎么好弄吧
本来也想这么弄来,后来发现有点困难。
等待高手出现!
[解决办法]
想不到完美解决方案 还觉得你的要求得继续增加一项:
那就是关闭浏览器的时候,你得判断用户有没有开着其他的窗口,用户有没有用多种浏览器同时在访问,如果你在关闭浏览器就让session失效,那么用户会很郁闷,因为他只是关了一个页面而已。
[解决办法]
既然是这么"简单",你自己怎么解决不了?
[解决办法]
为什么不在登陆之前清空session呢?
还有CSDN做到了,你给他写封信让他给你个方案

[解决办法]
退出网页时3 加这段代码:
session.invalidate();
这样退出时就把网页session清空了
[解决办法]
楼上说的对,调用session.invalidate();一定会清除SESSION的,所以你想想怎么调用就是了。
[解决办法]
这问题好简单呀
首先你要判断 用户关闭的是第几个网页?
For_suzhen(不懂装懂) 的办法可以呀 登陆前清空session


[解决办法]
这个建议用AJAX吧
如果某用户30分钟内不发一条信息过来
就删了她的SESSION
[解决办法]
session.validate()
[解决办法]
这个问题理论上面好象是没有办法做到

在客户端发送消息,当非正常关闭时就没有效果了


[解决办法]
//拔电源
这不太好处理吧,突然间断电,程序还没来得及反应,怎么处理?
[解决办法]
和我刚刚解决的问题一模一样,如果我直接关闭IE的话,服务器是不会知道的
我的做法是在session之外用用户ID 维护另外一套session信息HashMap,记录IP , sessionID
且这个信息会在session timeout的时候删除。

非正常退出后,再次登陆会依次比较:同ip的话,就直接进入了,换机器的话则需要额外的认证。

[解决办法]
1.利用onunload事件弹出一个新窗口来关闭session.

你非要弹出新窗口啊?
你既然都知道用onunload来监听, 就不会在onunload里提交一个表单给SERVLET? 然后在SERVLET里调用session.invalidate();

思维要发散
[解决办法]
请不要用“简单”来侮辱你自己
[解决办法]
两个思路,其他的都不能完美解决
1. 用ajax,每隔一段时间(比如30秒)就把登录ID传给服务器.没收到的话就认为他已下线.那该怎么处理就怎么处理.
2.第二次登录就直接踢掉上一次登录(我见过的大多数系统都采用这种方式.)

决不应该用session来判断一个用户是否登录.session是用来保存一个用户临时数据的.不是用来指明用户是否存在的.如果用户关了浏览器,那么他的session id自然就没有了,对应的session在设定的存活期过后(比如10分钟)就会自动销除.当然正常情况你也可以要求用户点退出按钮,在这里删掉session以节约资源.
[解决办法]
ajax可以实现无刷新的与服务器交互,这样就不用弹出新窗口了
onunload = remove()

function remove()
{
var url = "/servlet/ajaxShowActionServlet/ ";
var method = "post ";
var param = "flag=remove&fileName= "+$(fileName).value;


var helper = new ajaxHelper(url,method,param);
request = helper.creatXHR();
request.open( method, url, true );
request.setRequestHeader( 'Content-Type ', 'application/x-www-form-urlencoded;charset=UTF-8 ');
request.onreadystatechange = processRemove;
request.send(param);
}

function processRemove()
{
if(request.readyState==READY_STATE_COMPLETE)
{
var matchDocs = request.responseXML;
var param = $(fileName).value;
var content = new Content(param,matchDocs);
var out = content.outHtml();
$( "content_div ").innerHTML = out;
}
}

大致思路就是这样了
[解决办法]
CSDN 貌似已经变成 YY 论坛了。

工商银行那个网银就是这样,关掉IE的时候,总会提示:谢谢使用等字语。估计也顺便关闭了Session。
[解决办法]
呵呵 你可以监听session的 做一个实现HttpSessionListener接口的过滤器就可以的 有问题发邮件到lws.emmagee@163.com
[解决办法]
直接销毁!!
[解决办法]
帮顶
[解决办法]
老问题了,客户端失效是无法完美解决的,B/S模式的特点就是这样, 只能通过session超时控制.
[解决办法]

人为的让session死亡!
session.invalidate();


[解决办法]
同楼上的....
[解决办法]
那些只会说在退出的时候调用session.invalidate();来杀死session的人,请你们负点责任,我想问你们那句话写在什么地方?通过什么事件来监听浏览器触发关闭session的请求?session.invalidate();谁不知道?但是又有谁真正考虑过怎么触发这个事件?
你可能会说,写在onUnload事件里面,但是如果是提交请求怎么办?刷新请求怎么办?这些都是会触发onUnload事件的,所以请不要把这个问题考虑得太简单了。
[解决办法]
使用异步传输技术解决
页面捕捉关闭事件
在此事件中向服务端发送关闭消息
[解决办法]
服务器端可以监视一个客户端连到服务器的连接数,我可以负责任的说我也不知道怎么弄,只是给一下思路
[解决办法]
window.onbeforeunload = function(){
var n = window.event.screenX - window.screenLeft;
var b = n > document.documentElement.scrollWidth-20;
if(b && window.event.clientY < 0 || window.event.altKey)
{
window.location= '/Servlet/passport?action=logout ';
}
}

[解决办法]
先bs一下楼主理由同楼上诸位,外加bs楼主发完帖子就不出现了

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

如果把session设为2分钟 然后js每一分钟发送一次信号应该也可以吧
这样也不用在服务器端写程序了
这样应该可以吧
求验证
[解决办法]
js觸發action清空session就好了,穿著褲頭在那里大叫,這么簡單的問題
[解决办法]
我不知道LZ的应用是什么,楼上的诸位说了那么多解决方案,我觉得可行的就两种:
1,定时发心跳包到Server端,表示客户端还在,但是这个做法过于消耗资源,大大增加的服务器的压力,而且如果系统是不禁止多窗口的话,在每个窗口都要搞这么一个不停连接的JS,那服务器的压力就更加大了
2,第二次登陆直接吧第一次的session无效掉,这种方法比较好,而且一般来说WEB系统禁止单ID不能同时多次登陆都是采用这种做法的
[解决办法]
其实关键问题不在于使Session过期,楼主的要求是用户离开该web能尽快修改客户状态。
1.客户需要定时访问web(这个js就能实现)
2.在服器端建立一张所有客户的列表,维护客户信息,用户上一次访问的时间
在filter中更新这个时间属性,如果长时间不更新,就认为客户已经离开了。
------解决方案--------------------



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

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

^_^
[解决办法]
2.要在关闭网站最后一个窗口时才关闭session

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

没一个人提出这个的解决办法
[解决办法]
在不禁止js功能的情况下,使用定时器,可以在10秒内,甚至5秒内清楚。
如果全部的功能都禁止了,你的页面其它功能也就不存在了,也就谈不上这个问题了。


[解决办法]
我也正为这个问题郁闷呢 用户点击退出可以修改在线状态
但是关闭浏览器就不可以修改了 不知道这么解决 希望能找到答案
[解决办法]
我的思路是:
1.建立session的事件监听.当在规定时间内没有此用户的session,立即将此session清空.

[解决办法]
楼上有个哥们提到工行的网银系统,那个就做的不错,关闭登陆页面的时候会弹出一个小button楼主可以自己去看下,然后点确认就清空Session了
[解决办法]
关于这个问题我曾此冥思苦想。但最终还是不能做完美。就我个人来认为。这问题在中国暂时还没有一个尽如意的答案。如果代码。请至邮: liubinan@yahoo.com.cn
[解决办法]
1. 刷新,不论是要采用框架刷新或者ajax异步刷新.
2. socket连接
[解决办法]
前天客户提要求了,反和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) {}

------解决方案--------------------


利用onunload事件(弹出一个新窗口)来关闭session.
弹出新的窗口,可以用ajax来实现.
bs客户,你不跟服务器发送消息,服务器怎么知道你是不是注销了

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


[解决办法]
页面中放入一个 iframe 3分钟刷新一次向 服务器发一次请求, 服务器session过期时间为5分钟,或者使用ajax 3分钟发一次请求

意外关闭的话,服务器5分钟session清空,用户离线

热点排行
Bad Request.