【发布时间】:2010-11-27 15:46:24
【问题描述】:
我想知道我是否可以处理会话超时事件。我需要在会话超时或用户离开我的页面或关闭浏览器窗口之前对我的函数进行函数调用。这里最重要的部分是可以访问会话期间存储的所有内容,会话变量。
【问题讨论】:
标签: c# asp.net session timeout
我想知道我是否可以处理会话超时事件。我需要在会话超时或用户离开我的页面或关闭浏览器窗口之前对我的函数进行函数调用。这里最重要的部分是可以访问会话期间存储的所有内容,会话变量。
【问题讨论】:
标签: c# asp.net session timeout
看看 global.asax 中的 Session_End() 方法。 global.asax 文件应该已经连接到会话结束时调用此方法。您可以随意将代码放在那里。
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
' Fires when the session ends
End Sub
当然,您应该注意会话完全是服务器端的事情。它只会在 X 分钟不活动后结束(默认为 20 分钟)。它不会在用户关闭窗口的那一刻结束。 ASP.NET 不知道用户关闭窗口或离开您的页面。
事实上,当这种情况发生时,尝试在服务器端立即执行任何操作是很棘手的。我的意思是,在 Javascript 中调用 window.onbeforeunload 并在用户关闭窗口之前显示一个确认框很容易。但是,当您尝试在窗口实际关闭之前立即向服务器发送数据包时,我想您会发现使这一切变得用户友好是一项艰巨的任务。您可以编写一些 Javascript,使用 AJAX 向服务器发送消息,通知服务器用户正在关闭浏览器,然后在发送该消息后使用更多 Javascript 关闭浏览器。但是随后用户会收到恼人的消息(在大多数浏览器中),说明脚本正在尝试关闭窗口。这对用户来说看起来非常业余,并且可能会让他们三思而后行。
因此,如果您愿意忍受延迟,我会完全避免整个 Javascript 混乱,并依赖使用 Session_End() 的纯服务器端解决方案。毕竟,如果用户关闭窗口或离开,ASP.NET最终会注意到,因为会话将超时。
【讨论】:
网络是无状态的,因此您不会知道用户是否关闭了浏览器窗口。您可以使用 global.asax 文件中的 'Session_End' 事件来处理会话超时。如果你想访问所有会话,你可以通过 'Session_Start' 事件将它们存储在一个集合中,也可以在全局文件中..
编辑:如果您想使用 javascript 拦截页面的关闭事件,方法如下(注意,这是不可靠的):
window.onbeforeunload = closeIt;
function closeIt(){
return "You have unsaved changes. Are you sure you want to leave this page?";
}
【讨论】:
Session_end 将处理会话超时问题。但是,当用户关闭浏览器或移动到不同的 URL 时,这不会触发。它一直等到会话超时到期。
为了检测其他条件,您必须在客户端上使用 javascript。但是,这些方法并不总是可靠的,具体取决于浏览器/版本等。此外,如果用户的计算机关闭、拔掉电源或它们完全消失,此脚本将不会触发。
您可以考虑其他选择。你到底想用这个函数完成什么?
【讨论】:
您可以拥有一个由每个 aspx 页面继承的基础页面,并且在您的基础页面初始化事件中,只需检查会话变量即可。如果没有,则表示会话已过期,您可以将用户重定向到登录页面。
【讨论】: