【问题标题】:Session Timeout .NET会话超时.NET
【发布时间】:2013-02-08 07:22:26
【问题描述】:

我进行了搜索,但没有找到该问题的任何具体答案。 在会话到期之前,我如何在服务器中获得价值? 我的会话设置:

//超时例如10分钟。

<authentication mode="Forms"> <forms name=".ASPXAUTH_External" loginUrl="Authentication/Unauthorized.aspx" protection="All" timeout="10" path="/" slidingExpiration="true" defaultUrl="~/Pages/home.aspx" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/>
</authentication>
<sessionState mode="InProc" timeout="10">
</sessionState>

我得到初始值(它将得到 10*60 = 600 秒):

SessionStateSection sessionSection = (SessionStateSection)WebConfigurationManager.GetSection("system.web/sessionState");
countdown.Text = sessionSection.Timeout.TotalSeconds.ToString();

但是当会话时间少于一半并且用户执行一些操作时。我得到初始值 600,但它与剩余会话时间不相等,因为“slidingExpiration”添加一些时间(我不知道多少),但不会将会话剩余时间重置为开始 10 分钟点。

我如何才能获得到期前的剩余会话时间?

【问题讨论】:

    标签: asp.net .net session timeout


    【解决方案1】:

    按照 Drasius 方法,我编写了一个 VB 解决方案,如下所示。

    在 Session_Start 的 global.asa 中,我有 --

        Session("sessStart") = DateTime.Now
        Session("TO") = Session.Timeout
    

    在页面主文件中我有 --

        Dim timemsg As String = ""
        Dim sstrt As DateTime = Session("sessStart")
        timemsg = "Strt=" & sstrt.ToShortTimeString() & " TO=" & Session("TO") & "<br />"
        Dim datenow = DateTime.Now
        Dim cusrn = HttpContext.Current.User.Identity.Name
        If cusrn <> "" Then
            Dim authcookie As System.Web.HttpCookie
            authcookie = HttpContext.Current.Request.Cookies(FormsAuthentication.FormsCookieName)
            Dim authTicket As System.Web.Security.FormsAuthenticationTicket
            authTicket = FormsAuthentication.Decrypt(authcookie.Value)
            Dim leftminutes = (authTicket.Expiration - datenow).TotalMinutes
            timemsg &= "Remain: "
            If leftminutes > 0 Then
                timemsg &= leftminutes.ToString("F1") & " mins"
            Else
                timemsg &= "0 mins"
            End If
        End If
        lblShowTime.Text = timemsg
    

    这很有效——当我刷新页面时,我会减少超时时间。但是,剩余的初始时间总是显示 30 分钟,即使我的 web.config 设置如下:

    <sessionState mode="InProc" timeout="20" />
    

    所以我不太确定这种方法是否提供了与实际会话超时真正同步的超时。

    【讨论】:

      【解决方案2】:

      我发现会话到期的时间可以是这样的:

      DateTime dateNow = DateTime.Now;
      if (HttpContext.Current.User.Identity is FormsIdentity)
      {
          HttpCookie authCookie = this.Context.Request.Cookies[FormsAuthentication.FormsCookieName];
          FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
          double leftSeconds = (authTicket.Expiration - dateNow).TotalSeconds;
          // Control in MasterPage, where I setting value ant then taking for JavaSript to CountDown message
          countdown.Text = leftSeconds > 0 ? leftSeconds.ToString() : "0";
      } 
      

      【讨论】:

        【解决方案3】:

        如果你是服务器端,它会被重置(在任何回发时),所以如果你有 10 分钟,那就是 10 分钟。客户端您可以在最后一次访问服务器后设置一个计时器,例如,您可以设置一个 8 分钟的计时器,然后警告会话将在 2 分钟后到期...当然您希望显示剩余的实际时间,而不是静态的消息。

        查看 setTimeout 方法。 This link 提供了一些您可能使用的 javascript 计时方法的信息。

        【讨论】:

        • 这个。不能解决问题(滑动到期,doent set session expiration to starting point (10 min.) it adds“一段时间”。)...但是当会话时间少于一半并且用户执行一些操作时。我得到了 600 秒的值,但它与剩余会话时间不相等,因为“slidingExpiration”会增加一些时间(我不知道多少),但不会将会话剩余时间重置为开始 10 分钟点。
        猜你喜欢
        • 2023-02-02
        • 1970-01-01
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 2012-11-10
        • 1970-01-01
        • 2010-12-25
        相关资源
        最近更新 更多