【问题标题】:Killing session value in Browser Close在浏览器关闭中杀死会话值
【发布时间】:2013-03-23 04:35:02
【问题描述】:

我在 C#.Net 中工作。我想在浏览器关闭时终止会话值。 (即)在我的应用程序中,我想显示在线访问者数量。如果用户单击注销按钮意味着,它工作正常。而不是如果他关闭浏览器,会话值不会被清除。

如果浏览器关闭完成,会话值应该被杀死......

我的 Global.ascx 代码...

void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup      
    Application["OnlineUsers"] = 0;
}

void Application_End(object sender, EventArgs e)
{
    //  Code that runs on application shutdown
}

void Application_Error(object sender, EventArgs e)
{
    // Code that runs when an unhandled error occurs
}

void Session_Start(object sender, EventArgs e)
{
    Application.Lock();
    Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
    Application.UnLock();
}

void Session_End(object sender, EventArgs e)
{
    Application.Lock();
    Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
    Application.UnLock();
}

我的 Home.aspx 代码...

 Visitors online: <%= Application["OnlineUsers"].ToString() %>

如果我在 IE 中运行我的应用程序,在线计数将为 1。如果我在 Firefox 中运行,在线计数应增加到 2。如果我关闭 Firefox 浏览器,IE 中的计数应更改为 1。

这是我的要求....

【问题讨论】:

    标签: c# javascript


    【解决方案1】:

    Http 协议是无连接协议,因此除非您打算使用 websockets,否则终止用户会话的唯一两种方法应该是用户的直接请求(即按下注销链接)或会话超时.

    您不应依赖浏览器来终止会话。用户可能忘记关闭浏览器,或者他可能禁用了 javascript。相反,为用户提供关闭会话的方法,并将会话超时设置为根据用户活动调整的合理值。

    【讨论】:

      【解决方案2】:
      if (!Session.IsNewSession && Request.UrlReferrer == null)
      {
      
       }
      

      如果我们输入或粘贴 url,此代码将重定向到登录页面

      【讨论】:

        【解决方案3】:

        你可以像这样触发 javascript:

        <SCRIPT language="JavaScript">
        <!--
        function loadOut()
        {
            window.location="http://www.yoursite.com/loadout.php?sid=235346317";
        }
        //-->
        </SCRIPT>
        
        <body onBeforeUnload="loadOut()">
        

        您的 javascript 可以执行 AJAX 调用或其他任何操作。 我认为,当用户离开您的网站时,这也将起作用。

        这是您要搜索的内容吗?

        【讨论】:

          【解决方案4】:

          这个怎么样:

          <body onunload="doUnload()">
          

          然后是 javascript,会是这样的:

          function doUnload()
          {
             $.post("unset_session.php", { action: "unset" },
                   function(data) {
                   // Callback if wanted
              });
          }
          

          然后在你的 php 中,取消设置会话数据,或者销毁会话

          <?php
          if ($_POST['action'] == 'unset')
          {
               // Unset or Destroy the Session
               session_destroy();
          }
          
          ?>
          

          【讨论】:

          • 小心,在某些情况下,其他浏览器窗口可能会打开共享会话。在这种情况下,您也只需终止其他 Windows 会话。
          【解决方案5】:

          我在 IE 的 .net 应用程序中执行此操作,当用户单击浏览器右上角的 X 按钮时,我想强制用户注销。希望对您有所帮助。

          在母版页中:

           <script type="text/javascript">
              window.onbeforeunload = function (e) {
                  //alert("Killing the session on the server!!");
                  if ((window.event.clientX < 0) || (window.event.clientY < 0)) {
                      document.getElementById('<%= FORCE_LOGOUT_BTN.ClientID %>').click();
                  }
              } 
          </script>
          

          在.net site.master 页面中:

          <asp:Button ID="FORCE_LOGOUT_BTN" runat="server" CssClass="noShow"OnClick="ForceLogOut" Width="10px" />
          

          必须使用 CssClass,设置 Visible=false 不起作用,因为对象将变为 null。 css noShow 为:可见性:隐藏;

          在 site.master.cs 中

          public void ForceLogOut(object sender, EventArgs e)
          {
              FormsAuthentication.SignOut(); // since I use Form authentication
              Session.Abandon();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-11
            • 1970-01-01
            • 2012-07-09
            • 1970-01-01
            • 2010-12-03
            • 1970-01-01
            • 2015-04-23
            • 2011-04-11
            相关资源
            最近更新 更多