Asp.net mvc 4 会话过期后重定向到特定页面(MVC4)
C#MVC4项目:我想在会话到期时重定向到特定页面 经过一些研究,我将以下代码添加到我的项目中的Asp.net mvc 4 会话过期后重定向到特定页面(MVC4),asp.net-mvc-4,session,session-timeout,Asp.net Mvc 4,Session,Session Timeout,C#MVC4项目:我想在会话到期时重定向到特定页面 经过一些研究,我将以下代码添加到我的项目中的Global.asax: protected void Session_End(object sender, EventArgs e) { Response.Redirect("Home/Index"); } 当会话过期时,它在Response.Redirect(“Home/Index”)行抛出异常说此上下文中不提供响应 这里怎么了?MVC中最简单的方法是 在会话过期的情况下,在每个操作中
Global.asax
:
protected void Session_End(object sender, EventArgs e)
{
Response.Redirect("Home/Index");
}
当会话过期时,它在Response.Redirect(“Home/Index”)行抛出异常代码>说此上下文中不提供响应
这里怎么了?MVC中最简单的方法是
在会话过期的情况下,在每个操作中都必须检查其会话,如果会话为空,则重定向到索引页
为此,可以创建自定义属性,如图所示:-
下面是重写ActionFilterAttribute的类
public class SessionExpireAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
// check sessions here
if( HttpContext.Current.Session["username"] == null )
{
filterContext.Result = new RedirectResult("~/Home/Index");
return;
}
base.OnActionExecuting(filterContext);
}
}
然后在操作中只需添加此属性,如图所示:
[SessionExpire]
public ActionResult Index()
{
return Index();
}
或者只添加一次属性,如下所示:
[SessionExpire]
public class HomeController : Controller
{
public ActionResult Index()
{
return Index();
}
}
这是MVC中的一些新东西
Public class SessionAuthorizeAttribute : AuthorizeAttribute
{
Protected override void HandleUnauthorizeRequest(
AuthorizationContext filtercontext )
{
filtercontext.Result = new RedirectResult("~/Login/Index");
}
}
在您的控制器上应用此筛选器之后,请在您希望应用授权的控制器上应用此筛选器
[SessionAuthorize]
public class HomeController : Controller
{
// Something awesome here.
}
上述SessionAuthorizeAttribute的HandleUnauthorizerRequest函数仅在授权失败时调用,而不是重复检查授权
问候
MK创建此操作筛选器类
class SessionExpireAttribute : ActionFilterAttribute {
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.HttpContext.Session["logged"] == null)
{
filterContext.Result = new RedirectResult("/Account/Login");
}
base.OnActionExecuted(filterContext);
}
然后在你的课堂或方法中使用它,如下面的
[SessionExpireAttribute]
public class MyController : Controller
{
....
}
您正在使用formsauthentication…?@例外,我不确定,但我认为soNobody没有解释为什么会发生这种情况。与global.asax中的许多其他事件不同,Session\u End
事件不会在当前请求的上下文中发生-它是在正常运行时间之外发送到应用程序的偶数-因此您无法发出重定向请求。通常,此事件用于允许应用程序清理刚刚结束的会话中的资源。在请求过程中很难发生这种情况,因为请求首先要做的事情之一就是激活会话。如果您需要在任何地方都检查此项,请将其添加到全局筛选器列表中:GlobalFilters.filters.add(new SessionExpireFilterAttribute())代码>在Global.asax.cs中。无需添加到每个操作中。@chiapa有两种方法,一种是发布异常,另一种是我向您展示的,我认为在中国没有其他办法mvc@EhsanSajjad...yes..but在您的代码中,我们必须更改基本控制器,以便只检查会话..在我看来,最好使用自定义筛选器,而且如果在某些操作中我们希望跳过检查会话,则会产生问题…@EhsanSajjad and Exception,这是一次很好的讨论,我相信这件事需要一个更好的解决方案。我的疑问是,是否已经有更好的方法了?@Juhi..不,这是不可能的..肯定在其他地方有问题…OnActionExecuting()
方法将在每次操作执行之前调用,而不管会话如何。授权和会话是两件不同的事情,并且可以在不同的时间过期-您可以在仍然拥有有效会话的情况下撤销授权,并且您可以在身份验证令牌(因此授权)过期之前有一个会话超时。谢谢突出显示,但我仍然不清楚。请提供一个示例。当然:当用户访问您的站点时,.net可以发出会话令牌,通常有效期为20分钟,并在每次请求页面时重置。如果该用户随后登录,您将发出一个授权令牌,该令牌的到期时间可以长于或短于会话超时。如果更长,但用户没有访问更多页面,则会话将在20分钟后超时,但授权令牌仍然有效,如果用户返回您的站点,他们仍将登录(但将有一个新会话)。您建议的筛选器只有在用户未登录并尝试访问受限页面时才会启动。OP使用的情况类似于搜索页面或类似页面,其中会话超时并且丢失了所有更改,因此您需要重新启动,因为它们没有使用查询字符串