Wykrywanie wygaśnięcia sesji na ASP.NET MVC
Zbudowałem koszyk, który używa stanu sesji do przechowywania danych koszyka podczas przeglądania sklepu.
Mam problem, w którym jeśli pozostawiam okno przeglądarki otwarte przez długi czas na kroku 1 koszyka, a następnie naciśnij "Przejdź do kroku 2" , moje działania rzucają błąd, ponieważ akcja step2 zakłada, że sesja nie wygasła, a obiekt ShopCart jest w prawidłowym stanie.
Chciałbym, aby ten scenariusz był milszy dla moich użytkowników, ale myślę, że muszę jakoś wykryć, czy sesja wygasła, tak, że przy następnym żądaniu mogę rzucić je do Step1.
Znalazłem następujący kod, który twierdzi, że rozwiązuje problem, ale nie działa dla mnie.
Warunek IsNewSession jest prawdziwy, ale warunek
if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
// handle expired session
}
Zawsze zwraca false i nigdy nie obsługuje nieprawidłowej sesji. Jestem zdezorientowany.
Czy jest to możliwe w ASP.NET (i MVC)?
2 answers
Sposób 1
Umieść ten kod w Init
/ Load
Zdarzenie na stronie 2...
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");
}
}
}
Sposób 2
Alternatywa możesz sprawdzić, czy obiekt Session
istnieje przed przystąpieniem do pracy z nim na stronie 2, Tak:
if (Session["Key"] != null)
{
Object O1 = (Object) Session["Key"];
}
else
{
Response.Redirect("ErrorPage.aspx");
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 16:37:03
Odpowiedź Króla mi nie odpowiada. Dodałem FormsAuthentication.SignOut()
w OnActionExcuting()
. Response.Redirect
nie zadziała!
if (Request.IsAuthenticated)
{
FormsAuthentication.SignOut();
}
To jest moja kompletna metoda
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);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 16:38:43