Asp.net mvc 4 会话过期后重定向到特定页面(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中最简单的方法是 在会话过期的情况下,在每个操作中

C#MVC4项目:我想在会话到期时重定向到特定页面

经过一些研究,我将以下代码添加到我的项目中的
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使用的情况类似于搜索页面或类似页面,其中会话超时并且丢失了所有更改,因此您需要重新启动,因为它们没有使用查询字符串