【问题标题】:How to get notified of session end?如何获得会话结束的通知?
【发布时间】:2010-11-27 15:46:24
【问题描述】:

我想知道我是否可以处理会话超时事件。我需要在会话超时或用户离开我的页面或关闭浏览器窗口之前对我的函数进行函数调用。这里最重要的部分是可以访问会话期间存储的所有内容,会话变量。

【问题讨论】:

    标签: c# asp.net session timeout


    【解决方案1】:

    看看 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最终会注意到,因为会话将超时。

    【讨论】:

    • 但是,您应该知道并非所有会话状态提供程序都支持 Session_End 事件。 InProc 会话状态应该没问题,但对于其他人,您需要在依赖此事件之前检查提供程序文档。
    • 好点。我不相信它适用于 StateServer 或 SQLServer 会话。
    • fyi - 我的 javascript 评论是为了回应 david 的评论,即“弹出一条消息提醒用户在离开页面之前保存”既困难又丑陋——事实并非如此。我并没有建议将其作为处理 session_end 的解决方案。那将是精神上的。
    • 谢谢,我知道全局 Session_End 函数,我只是不确定它是否可以处理超时并保存过期会话的变量。 JavaScript 解决方案确实很丑陋。
    【解决方案2】:

    网络是无状态的,因此您不会知道用户是否关闭了浏览器窗口。您可以使用 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?";
    
    }
    

    【讨论】:

    • 重要的是要记住网站不是 Windows 程序。例如,很难在用户离开页面之前弹出一条消息提醒用户保存。这是可能的,但并不容易,而且通常非常难看。
    • David - 不,这并不难,它只是像 Windows 对话框一样丑陋。
    • 我认为它很难看,因为您无法控制消息框的外观。例如,在 Windows 中,您至少可以将其样式设置为相同。你可以有一个漂亮的网站,然后这里是丑陋的消息框。
    • 我同意能够为对话框设置样式会很好,但 Stackoverflow 使用它,它从不冒犯我,它对大多数用户来说很常见..
    【解决方案3】:

    Session_end 将处理会话超时问题。但是,当用户关闭浏览器或移动到不同的 URL 时,这不会触发。它一直等到会话超时到期。

    为了检测其他条件,您必须在客户端上使用 javascript。但是,这些方法并不总是可靠的,具体取决于浏览器/版本等。此外,如果用户的计算机关闭、拔掉电源或它们完全消失,此脚本将不会触发。

    您可以考虑其他选择。你到底想用这个函数完成什么?

    【讨论】:

      【解决方案4】:

      您可以拥有一个由每个 aspx 页面继承的基础页面,并且在您的基础页面初始化事件中,只需检查会话变量即可。如果没有,则表示会话已过期,您可以将用户重定向到登录页面。

      【讨论】:

        猜你喜欢
        • 2019-11-07
        • 2012-04-11
        • 2017-01-21
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        相关资源
        最近更新 更多