【问题标题】:Get ASP.NET Session Last Access Time (or Time-to-Timeout)获取 ASP.NET 会话上次访问时间(或 Time-to-Timeout)
【发布时间】:2010-12-01 00:31:24
【问题描述】:

我正在尝试确定给定的 ASP.NET 会话在超时之前还剩多少时间。

如果没有现成的 time-to-timeout 值,我也可以从它的最后一次访问时间计算它(但我也没有找到这个)。知道怎么做吗?

【问题讨论】:

    标签: asp.net session session-state session-timeout


    【解决方案1】:

    如果您在服务器上处理请求,那么超时刚刚被重置,所以剩下的整整 20 分钟(或任何您配置的时间)。

    如果您需要客户端警告,则需要创建一些 JavaScript 代码,该代码将在“现在”大约 20 分钟后触发。请参阅 setTimeout 方法。

    我用它在请求页面 15 分钟后显示警告。它会弹出一条警报,例如“您的会话将在 {HH:mm} 到期,请保存您的工作”。使用了确切的时间而不是“5 分钟内”,因为您永远不知道用户何时会看到该消息(他是否在警报触发 10 分钟后返回到他的计算机?)。

    【讨论】:

    • 这种解决方案只有在您的应用程序一次不使用超过一页的情况下才有效。如果用户打开一个弹出窗口并点击那里的东西怎么办?会话将被“更新”,但第一页的计数器时间继续运行。
    • 我同意格里夫斯先生的观点。如果您有多个页面,那么单页面客户端解决方案是不准确/具有误导性的。我实际上发现了这个问题,因为我正在寻找一个多页面解决方案。
    • 每个解决方案都有它的缺点。您也可以采取相反的方式:只要页面打开,就使用 ajax 保持会话处于活动状态,但您不希望在网上银行应用程序中这样做。
    【解决方案2】:

    对于多页解决方案,可以将最后一次请求时间保存在 cookie 中,而 javascript 可以考虑这个最后一次访问时间来处理警告消息或注销操作。

    【讨论】:

      【解决方案3】:

      我刚刚实施了一个像这里问的那样的解决方案,它似乎有效。我有一个MVC 应用程序,并且在我的_Layout.chtml 页面中有这个代码,但它可以在asp.net 应用程序中工作,只要将它放在我认为的母版页中。我通过amplify.js 插件使用本地会话存储。我使用本地会话存储,因为正如 Grieves 先生所说,可能存在用户以一种不会导致页面刷新或重定向但仍会重置服务器上的会话超时的方式访问应用程序的情况。

      $(document).ready(function () {
      
      var sessionTimeout = '@(Session.Timeout)'; //from server at startup
      amplify.store.sessionStorage("sessionTimeout", sessionTimeout);
      amplify.store.sessionStorage("timeLeft", sessionTimeout);
      setInterval(checkSession, 60000); // run checkSession this every 1 minute
          function checkSession() {
          var timeLeft = amplify.store.sessionStorage("timeLeft");
          timeLeft--; // decrement by 1 minute
          amplify.store.sessionStorage("timeLeft", timeLeft);
              if (timeLeft <= 10) {
              alert("You have  " + timeLeft + " minutes before session timeout. ");
                         }
           }
      });
      

      然后在用户从不导致页面刷新但仍然访问服务器从而导致会话重置的页面中,我将其放在按钮单击事件上:

      $('#MyButton').click(function (e) {
      
         //Some Code that causes session reset but not page refresh here
          amplify.store.sessionStorage("sessionTimeout", 60); //default session timeout
          amplify.store.sessionStorage("timeLeft", 60);
      
      
      });
      

      使用本地会话存储允许我的 _Layout.chtml 代码看到会话已在此处重置,即使页面从未刷新或重定向。

      【讨论】:

        【解决方案4】:

        您可以从以下位置获取超时时间:

        Session.Timeout
        

        这还不足以提供信息吗,因为每次请求都会重置超时?不知道您想如何在不发出请求的情况下显示此内容?

        无论如何,最好的方法是在每个请求上设置一些具有最后访问时间的 Session 变量。那应该提供远程信息。

        【讨论】:

          猜你喜欢
          • 2018-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 1970-01-01
          • 2012-10-26
          • 1970-01-01
          相关资源
          最近更新 更多