web-dev-qa-db-ja.com

ASP.NET MVCでのセッションの有効期限の検出

ユーザーがストアを閲覧している間、セッション状態を使用してショッピングカートデータを保持するショッピングカートを作成しました。

ショッピングカートのステップ1でブラウザウィンドウを長時間開いたままにして、「ステップ2に進む」を押すと、ステップ2アクションではセッションが期限切れではないと想定されるため、アクションがエラーをスローするという問題があります。 ShopCartオブジェクトは正しい状態です。

このシナリオをユーザーにとってより良いものにしたいのですが、次のリクエストでそれらをStep1にスローできるように、セッションの有効期限が切れているかどうかを何らかの方法で検出する必要があると思います。

問題を解決すると主張する次のコードを見つけましたが、うまくいきません。

IsNewSession条件はtrueですが、条件

if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
   // handle expired session
}

常にfalseを返し、無効なセッションを処理しません。よくわかりません。

これはASP.NET(およびMVC)で可能ですか?

25
CVertex

方法1

このコードをページ2のInit/Loadイベントに配置します...

        if (Context.Session != null)
        {
            if (Context.Session.IsNewSession)
            {
                string sCookieHeader = Request.Headers["Cookie"];
                if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                {

                    if (Request.IsAuthenticated)
                    {
                        FormsAuthentication.SignOut();
                    }
                    Response.Redirect("Error Page");
                }
            }
        }

方法2

別の方法として、次のように、ページ2での作業に進む前にSessionオブジェクトが存在するかどうかを確認できます。

if (Session["Key"] != null)
{
   Object O1 = (Object) Session["Key"]; 
}
else
{
    Response.Redirect("ErrorPage.aspx");
}
18
The King

王の答えは私には役に立たない。 FormsAuthentication.SignOut()OnActionExcuting()を追加しました。 Response.Redirect 動作しないでしょう!

if (Request.IsAuthenticated)
{
    FormsAuthentication.SignOut();
}

これは私の完全な方法です

public class SessionExpireFilterAttribute : ActionFilterAttribute
    {

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpContext ctx = HttpContext.Current;

            // check if session is supported
            if (ctx.Session != null)
            {

                // check if a new session id was generated
                if (ctx.Session.IsNewSession)
                {

                    // If it says it is a new session, but an existing cookie exists, then it must
                    // have timed out
                    string sessionCookie = ctx.Request.Headers["Cookie"];
                    if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
                    {
                        string redirectOnSuccess = filterContext.HttpContext.Request.Url.PathAndQuery;
                        string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
                        string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
                        if (ctx.Request.IsAuthenticated)
                        {
                            FormsAuthentication.SignOut();
                        }
                        RedirectResult rr = new RedirectResult(loginUrl);
                        filterContext.Result = rr;
                        //ctx.Response.Redirect("~/Home/Logon");

                    }
                }
            }

            base.OnActionExecuting(filterContext);
        }
    }
15
Tom