Обнаружение истечения сеанса в ASP.NET MVC
Я создал корзину покупок, которая использует состояние сеанса для хранения данных корзины покупок, пока пользователь просматривает магазин.
У меня есть проблема, когда я оставляю окно браузера открытым на шаге 1 в корзине покупок, а затем нажимаю "перейти к шагу 2", мои действия выдают ошибку, потому что действие step2 предполагает, что сеанс не истек, и Объект ShopCart находится в правильном состоянии.
Мне бы хотелось, чтобы этот сценарий был более приятным для моих пользователей, но я думаю, что мне нужно каким-то образом определить, истек ли сеанс, чтобы при следующем запросе я мог выбросить их на шаг 1.
Я нашел следующий код, который претендует на решение проблемы, но он не работает для меня.
Условие IsNewSession верно, но условие
if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
// handle expired session
}
всегда возвращает false и никогда не обрабатывает неверный сеанс. Я не совсем понимаю.
Возможно ли это в ASP.NET (и MVC)?
2 ответа
Способ 1
Поместите этот код в Init
/ Load
событие страницы 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");
}
}
}
Способ 2
Альтернативно вы можете проверить, Session
Объект существует, прежде чем приступить к работе с ним на странице 2, например:
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);
}
}
Вам нужно создать Session_OnEnd метод В Global.asax.cs файл в вашем проекте.
это мой код, и я могу определить истечение срока действия сеанса в ASP.NET MVC
protected void Session_OnEnd(object sender, EventArgs e)
{
int userid = 0;
userid = Convert.ToInt32(Session["UserID"]);
if (userid != 0)
{
var userActivity = DependencyResolver.Current.GetService<IUserRepo>();
var responce = userActivity.LogOutUsers(userid);
if (responce == true)
{
Session.Clear();
Session.Abandon();
}
}
}