当前位置:  开发笔记 > 后端 > 正文

ASP.Net会话超时检测:Session.IsNewSession和SessionCookie检测是最好的方法吗?

如何解决《ASP.Net会话超时检测:Session.IsNewSession和SessionCookie检测是最好的方法吗?》经验,为你挑选了1个好方法。

当我的ASP.Net会话超时(并形成身份验证)并尝试点击页面时,我会自动重定向到我的默认login.aspx页面.

在页面加载之前,我需要确定这是否是超时情况,如果是 - 重定向到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;
                }
            }
        }    
}

AnthonyWJone.. 7

您是要尝试区分超时会话和手动注销的会话?

您的问题是,由于会话数据消失了,您只需要进入的新请求创建了一个新会话,并且进入的请求带有会话ID cookie(表示它之前已登录).

有两种方法.

曲奇饼:

首先在登录页面中,您可以创建一个指示用户登录状态的附加cookie.当用户手动注销时,cookie值被修改以指示注销.会话超时后的请求除了具有IsNewSessiontrue之外还将具有登录状态cookie,显示用户仍然登录,从而表示用户没有手动选择退出.

数据库:

第二种方法是将sessionID存储在DB表中以及登录状态.登录成功后,将sessionID输入LoggedOnSessions表.当用户手动注销时,从表中删除sessionID.因此,您的超时检测可以包括查找表中的会话ID(如果存在超时)(此时您也应该删除ID).

出于清洁目的,您应该包含一个到期日期时间字段,其设置的时间比任何实际登录时间(例如一周)长得多.定期(例如,每周)删除表中已过期的条目.

我的偏好是数据库方法我讨厌设置cookie,因为它让我觉得每次请求都会发送cookie但很少需要.



1> AnthonyWJone..:

您是要尝试区分超时会话和手动注销的会话?

您的问题是,由于会话数据消失了,您只需要进入的新请求创建了一个新会话,并且进入的请求带有会话ID cookie(表示它之前已登录).

有两种方法.

曲奇饼:

首先在登录页面中,您可以创建一个指示用户登录状态的附加cookie.当用户手动注销时,cookie值被修改以指示注销.会话超时后的请求除了具有IsNewSessiontrue之外还将具有登录状态cookie,显示用户仍然登录,从而表示用户没有手动选择退出.

数据库:

第二种方法是将sessionID存储在DB表中以及登录状态.登录成功后,将sessionID输入LoggedOnSessions表.当用户手动注销时,从表中删除sessionID.因此,您的超时检测可以包括查找表中的会话ID(如果存在超时)(此时您也应该删除ID).

出于清洁目的,您应该包含一个到期日期时间字段,其设置的时间比任何实际登录时间(例如一周)长得多.定期(例如,每周)删除表中已过期的条目.

我的偏好是数据库方法我讨厌设置cookie,因为它让我觉得每次请求都会发送cookie但很少需要.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有