我搜索了但是我没有找到这个问题的具体答案。 在会话到期之前,如何在服务器中获得剩余时间? 我的会话设置:
//超时,例如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分钟点。
如何在到期前获得剩余会话时间?
答案 0 :(得分: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";
}
答案 1 :(得分: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 :(得分:0)
如果你是服务器端,它会被重置(在任何回发上),所以如果你有10分钟,那就是10分钟。客户端可以在最后一次服务器之后设置一个计时器,例如你可以设置一个8分钟的计时器然后警告该会话在2分钟后到期...当然你要显示实际剩余时间,而不是静态消息。
查看setTimeout方法。 This link有关于您可能使用的一些javascript计时方法的信息。