在页面加载之前,我需要确定这是否是超时情况,如果是 – 重定向到timeout.aspx.
下面的文章指定如果IsNewSession为true,并且存在sessionID cookie – 那么您有超时情况.
然而,在我的测试中,我遇到了我超时并尝试重新登录并且IsNewSession等于true并且sessionId cookie仍然闲置(因为它保留整个浏览器会话)的情况,因此它说我已经定时当我只是想重新登录时再次出现.
有没有更好的方法来做这一切?
在我的’global.asax’文件中,我有:
void Application_PreRequestHandlerExecute(object sender,EventArgs e) { // Check if session state is enabled in web.config if (Context.Session == null) return; if (Session["user"] == null) { if (Session.IsNewSession) { HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"]; if ((null != sessionCookie) && !string.IsNullOrEmpty(sessionCookie.Value)) { /* Session Timeout! */ FormsAuthentication.SignOut(); //just in case not done yet Session.Abandon(); Response.Redirect("timeout.aspx"); } else { // Cookie didn't exist - must be a brand new login return; } } else { // If there is no session data and the session is not new then it must be the postback of the login screen. if ((HttpContext.Current.Request.Path.ToLower().LastIndexOf("/login.aspx") >= 0) && (Request.HttpMethod == "POST")) { return; } } } }
解决方法
您的问题是,由于会话数据已经消失,您只需要进行新请求即可创建新会话,并且进入的请求会携带会话ID cookie(表示之前已登录).
有两种方法.
曲奇饼:
首先,在您的登录页面中,您可以创建一个指示用户登录状态的附加cookie.当用户手动注销时,cookie值被修改以指示注销.会话超时后的请求除了具有IsNewSession true之外还将具有登录状态cookie,其显示用户仍然登录,从而指示用户未手动选择退出.
数据库:
第二种方法是将sessionID存储在DB表中以及登录状态.登录成功后,将sessionID输入LoggedOnSessions表.当用户手动注销时,从表中删除sessionID.因此,您的超时检测可以包括查找表中的会话ID(如果存在超时)(此时您应该也可以删除ID).
出于清洁目的,您应该包括一个到期日期时间字段,其设置的时间比任何实际登录时间(例如一周)长得多.定期(例如,每周)删除表中已过期的条目.
我的偏好是数据库方法我讨厌设置cookie,因为它让我觉得每次请求都会发送cookie但很少需要.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。