代码之家  ›  专栏  ›  技术社区  ›  Maksim Vi.

如何得到会话结束的通知?

  •  4
  • Maksim Vi.  · 技术社区  · 15 年前

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

    4 回复  |  直到 11 年前
        1
  •  7
  •   Steve Wortham    15 年前

    查看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,并在用户关闭窗口之前打开一个确认框。但是,当您试图在窗口实际关闭之前立即向服务器发送数据包时,我认为您会发现,要使它变得更加用户友好是一项困难的任务。您可以使用Ajax编写一些javascript来向服务器发送消息,Ajax通知服务器用户正在关闭浏览器,然后在发送消息后使用更多的javascript来关闭浏览器。但是用户会收到一条烦人的消息(在大多数浏览器中),说明脚本正在试图关闭窗口。对于用户来说,这看起来非常业余,可能会让他们对回来三思而后行。

    因此,如果您愿意忍受延迟,我将完全避免整个javascript混乱,并依赖使用session_end()的纯服务器端解决方案。毕竟,如果用户关闭窗口或离开,ASP.NET将 最后 注意,因为会话将超时。

        2
  •  3
  •   ChrisLively    15 年前

    会话结束将处理会话超时问题。但是,当用户关闭浏览器或移动到其他URL时,这不会触发。它等待会话超时结束。

    为了检测其他条件,必须在客户机上使用javascript。但是,这些方法并不总是可靠的,这取决于浏览器/版本等。此外,如果用户的计算机关机、拔下插头,或者它们完全消失,这个脚本就不会启动。

    你可以考虑其他的选择。你到底想用这个功能完成什么?

        3
  •  2
  •   flesh    15 年前

    Web是无状态的,因此您将不知道用户是否关闭了浏览器窗口。您可以使用global.asax文件中的“session\u end”事件来超时会话。如果要访问所有会话,可以通过“会话\启动”事件将它们存储在集合中,也可以存储在全局文件中。

    编辑:如果您想使用javascript截获页面的关闭事件,下面是方法(注意,这是不可靠的):

    window.onbeforeunload = closeIt;
    
    function closeIt(){ 
    
    
      return "You have unsaved changes. Are you sure you want to leave this page?";
    
    }
    
        4
  •  0
  •   SoftwareGeek    15 年前

    您可以有一个base page,它由您的base page init事件中的每个aspx页继承,只需检查会话变量是否为空即可。如果没有,则表示会话已过期,您可以将用户重定向到登录页面。