[C#] 用戶會話過期時如何重定向到頁面?



Answers

當用戶“登錄”時,我通常將HtmlMeta控件添加到母版頁上的Page.Header.Controls集合中。 將其設置為刷新到您的SessionExpired.aspx頁面,具有適當的超時長度,並且您很好。

Question

我目前正在使用ASP.NET 2.0框架的Web應用程序。 當用戶會話到期時,我需要重定向到某個頁面,例如SessionExpired.aspx。 該項目中有很多頁面,因此向網站的每個頁面添加代碼並不是一個很好的解決方案。 我有MasterPages,我認為可能會有所幫助。

謝謝!




代碼從這裡

namespace PAB.WebControls

{使用系統; 使用System.ComponentModel; 使用System.Web; 使用System.Web.Security; 使用System.Web.UI;

[DefaultProperty("Text"),

    ToolboxData("<{0}:SessionTimeoutControl runat=server></{0}:SessionTimeoutControl>")]

public class SessionTimeoutControl : Control
{
    private string _redirectUrl;

    [Bindable(true),
        Category("Appearance"),
        DefaultValue("")]
    public string RedirectUrl
    {
        get { return _redirectUrl; }

        set { _redirectUrl = value; }
    }

    public override bool Visible
    {
        get { return false; }

    }

    public override bool EnableViewState
    {
        get { return false; }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        if (HttpContext.Current == null)

            writer.Write("[ *** SessionTimeout: " + this.ID + " *** ]");

        base.Render(writer);
    }


    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if (this._redirectUrl == null)

            throw new InvalidOperationException("RedirectUrl Property Not Set.");

        if (Context.Session != null)
        {
            if (Context.Session.IsNewSession)
            {
                string sCookieHeader = Page.Request.Headers["Cookie"];

                if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    if (Page.Request.IsAuthenticated)
                    {
                        FormsAuthentication.SignOut();
                    }

                    Page.Response.Redirect(this._redirectUrl);
                }
            }
        }
    }
}

}




當會話過期時,您不能重定向用戶,因為沒有瀏覽器請求重定向:

  • 如果用戶在會話超時(默認20分鐘)內訪問您的站點,則會話尚未結束,因此您不需要重定向它們。
  • 如果用戶在會話超時後訪問您的網站,則會話已經結束。 這意味著它們將處於新會話的上下文中 - Session_OnEnd已經為舊會話觸發,而您將獲得新會話的Session_OnStart。

除了客戶端功能(例如JavaScript定時器等)之外,您因此需要在Session_OnStart中處理重定向,但顯然您需要將此與重新進入站點的用戶區分開來。 一個選擇是在會話開始時設置一個會話cookie(例如,一個沒有到期的cookie,這樣它只能持續到瀏覽器關閉),然後在Session_OnStart中查找該cookie - 如果存在,它是一個返回的用戶會話,如果不是,它是一個新的用戶。

很明顯,你仍然可以使用Session_OnEnd在服務器端進行整理 - 這僅僅是客戶端交互不可用。




我們使用表單身份驗證並在Page_Load方法中調用此方法

private bool IsValidSession()
    {
        bool isValidSession = true;
        if (Context.Session != null)
        {
            if (Session.IsNewSession)
            {
                string cookieHeader = Request.Headers["Cookie"];
                if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {
                    isValidSession = false;
                    if (User.Identity.IsAuthenticated)
                        FormsAuthentication.SignOut();
                    FormsAuthentication.RedirectToLoginPage();
                }
            }
        }
        return isValidSession;
    }



添加或更新您的Web.Config文件以包含此類或類似內容:

<customErrors defaultRedirect="url" mode="RemoteOnly">
    <error statusCode="408" redirect="~/SessionExpired.aspx"/>
</customErrors>





Links