ユーザーがストアを閲覧している間、セッション状態を使用してショッピングカートデータを保持するショッピングカートを作成しました。
ショッピングカートのステップ1でブラウザウィンドウを長時間開いたままにして、「ステップ2に進む」を押すと、ステップ2アクションではセッションが期限切れではないと想定されるため、アクションがエラーをスローするという問題があります。 ShopCartオブジェクトは正しい状態です。
このシナリオをユーザーにとってより良いものにしたいのですが、次のリクエストでそれらをStep1にスローできるように、セッションの有効期限が切れているかどうかを何らかの方法で検出する必要があると思います。
問題を解決すると主張する次のコードを見つけましたが、うまくいきません。
IsNewSession条件はtrueですが、条件
if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
// handle expired session
}
常にfalseを返し、無効なセッションを処理しません。よくわかりません。
これはASP.NET(およびMVC)で可能ですか?
このコードをページ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での作業に進む前にSession
オブジェクトが存在するかどうかを確認できます。
if (Session["Key"] != null)
{
Object O1 = (Object) Session["Key"];
}
else
{
Response.Redirect("ErrorPage.aspx");
}
王の答えは私には役に立たない。 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);
}
}