【问题标题】:Is this possible to clear the session whenever browser closed in asp.net?每当浏览器在 asp.net 中关闭时,这是否可以清除会话?
【发布时间】:2012-10-26 05:13:53
【问题描述】:

在我的 asp.net 应用程序中,我想在我的浏览器关闭或我的标签页(如果我的浏览器包含多个标签页)关闭时清除会话。

请指导我摆脱这个问题...

【问题讨论】:

    标签: c# asp.net session


    【解决方案1】:

    短版,没有。 服务器没有可靠的方法来检测客户端是否关闭了浏览器。这只是 Web 开发异步模式的本质。

    长版,如果它对你真的非常重要的话; 在页面中放置一些 javascript,在后台向您的网站发送常规帖子,并设置一个服务器端代理或服务,如果它没有收到这些常规“心跳”信号,则处理会话。

    您可以在页面的 unload() 事件上放置一个 javascript 回发,但不要依赖它,它不会总是触发。

    【讨论】:

    • 为心跳设置控制器操作或处理程序的替代方法是将会话超时设置为心跳间隔后一分钟。然后浏览器会自动处理它自己的会话,因为 cookie 会过期。
    • 请不要使用 javascript 方法,因为这会阻止超时功能执行它的关键安全功能之一 - 如果用户离开他们的 PC,则将其注销。我保证,如果您这样做并在您的网站上获得专业的安全审核,那么没有超时将被标记为问题。
    【解决方案2】:

    默认情况下,只要您关闭浏览器,就会发生这种情况,而这不仅适用于 ASP.NET。它适用于大多数具有会话状态的服务器端编程语言。基本上,任何未指定到期日期的 cookie 都会在浏览器关闭时被删除。

    这不适用的情况是,当您关闭选项卡时,您将无法控制,因为选项卡关闭事件不会被发送回 Web 服务器。

    【讨论】:

      【解决方案3】:

      您可以尝试使用 javascript 来实现。检查它:

      http://www.codeproject.com/Tips/154801/How-to-end-user-session-when-browser-closed

      【讨论】:

        【解决方案4】:

        或者,您可以在每次打开新浏览器时检查您之前的会话状态,并且可以在之前的会话中使用 Session.clear() 或 Session.abandon()。

        这将确保您每次启动应用程序时都会获得新会话。

        1. 在您的 .net 应用程序中使用 BasePage。
        2. 在基本页面加载时检查 session.sessionid。
        3. 更多信息如何检测基本页面中的新会话。 BasePage.Session.Link

        希望这会有所帮助 问候 沙兹

        public class BasePage : Page
        {
        
                    protected string mySessionId;   
        
                    private CurrentUser _currentUser;
                    public CurrentUser _CurrentUser
                    {
                        get { return ((CurrentUser)HttpContext.Current.Session["myCurrentUser"]); }
                        set { _currentUser = value; }
                    }
        
        
                    protected override void OnLoad(EventArgs e)
                    {
        
                        if (Session["myCurrentUser"] != null)
                        {
                            if (_CurrentUser.ProUser)
                            {
        
                               mySessionId = Session.SessionID; // it means New Session
        
                            }
        
                            if (!mySessionId.IsNullOrDefault() && mySessionId != Session.SessionID)
                            {
                                Session.Abandon(); //Abandon current session and start new one                
        
                            }
                        }
        
        
                    }
        
        }
        

        【讨论】:

          【解决方案5】:

          我认为cookies在这里可以更好地满足您对会话管理的要求。

          这意味着会话数据不应存储在服务器上,并且 应该随你的电话,让你不用担心 清除服务器上的数据。

          【讨论】:

          • cookies与浏览器的关闭事件有什么关系?如果用户关闭浏览器,则不会触发任何内容。 cookie 将在那里,在客户端,什么都不做。
          • @RenéWolferinkL:意思是会话数据不应该存储在服务器上,应该和你的通话一起,这样你就不用担心清除服务器上的数据了。
          【解决方案6】:

          是的。首先,当浏览器关闭时,浏览器会自动清除会话。您可以尝试使用 javascript 函数在浏览器中捕获浏览器关闭或选项卡关闭事件,例如在卸载之前和卸载时。主要是 onbefore unload 事件捕获 chrome、Firefox、IE 11 中的浏览器关闭事件。

          【讨论】:

            【解决方案7】:

            可以使用 Global.aspx 的 Session_End 事件

            //For Specific Session
            Session.Remove("SessionName");
            
            //All the Session
            Session.Abandon();
            

            【讨论】:

            • 是的 - 如果会话超时期限(我相信 IIS 为 20 分钟,如果未明确设置)达到且没有来自浏览器的进一步请求,则该事件将触发。所以这是一种猜测,通常会在用户真正停止使用您的网站后的一段时间内发生。
            • 仅在会话超时时调用。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-08-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多