Détection de l'expiration de la Session ASP.NET MVC
j'ai construit un panier qui utilise L'État de Session pour conserver les données du panier pendant que l'utilisateur navigue dans le magasin.
j'ai un problème où si je laisse la fenêtre du navigateur ouverte pendant une longue période sur l'étape 1 du panier, puis appuyez sur "go to step 2", Mes actions jettent une erreur parce que l'action step2 suppose que la session n'a pas expiré et L'objet ShopCart est dans le bon état.
j'aimerais que ce scénario sera plus agréable pour mes utilisateurs, mais je pense que je besoin de détecter d'une façon ou d'une autre si la session a expiré de sorte que sur la prochaine demande, je peux les jeter à L'Étape1.
j'ai trouvé le code suivant, qui prétend résoudre le problème, mais il ne fonctionne pas pour moi.
la condition IsNewSession est vraie mais la condition
if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
// handle expired session
}
retourne toujours false et ne gère jamais la session invalide. Je suis confus.
Est-ce possible en ASP.NET (et MVC)?
2 réponses
1
Mettez ce code dans le Init
/ Load
événement de la Page 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");
}
}
}
voie 2
Alternative, vous pouvez vérifier si le Session
objet existe avant de continuer à travailler avec elle dans la Page 2, comme ceci:
if (Session["Key"] != null)
{
Object O1 = (Object) Session["Key"];
}
else
{
Response.Redirect("ErrorPage.aspx");
}
la réponse du Roi ne fonctionne pas pour moi. J'ai ajouté FormsAuthentication.SignOut()
OnActionExcuting()
. Response.Redirect
ne fonctionnera pas!
if (Request.IsAuthenticated)
{
FormsAuthentication.SignOut();
}
C'est ma méthode complète
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);
}
}