Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC 3中如何处理会话超时_Asp.net Mvc_Session Timeout_Action Filter - Fatal编程技术网

Asp.net mvc MVC 3中如何处理会话超时

Asp.net mvc MVC 3中如何处理会话超时,asp.net-mvc,session-timeout,action-filter,Asp.net Mvc,Session Timeout,Action Filter,我经常遇到会议超时的问题 我想编写一个可在每个控制器上使用的通用筛选器,筛选器应将用户重定向到登录位置,并在登录后返回到用户上次发送请求的位置。您可以尝试以下操作: public class SessionExpireAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExe

我经常遇到会议超时的问题


我想编写一个可在每个控制器上使用的通用筛选器,筛选器应将用户重定向到登录位置,并在登录后返回到用户上次发送请求的位置。

您可以尝试以下操作:

public class SessionExpireAttribute : ActionFilterAttribute {
    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        base.OnActionExecuted(filterContext);
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Session != null) {
            if (filterContext.HttpContext.Session.IsNewSession) {
                var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];
                if ((sessionCookie != null) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) {
                    // redirect to login
                }
            }
        }
    }
}

您是否尝试过现有的授权筛选器?

如上所述。。试试这个

public class SessionExpireAttribute : ActionFilterAttribute {

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Session != null) {
            if (filterContext.HttpContext.Session.IsNewSession) {
                filterContext.Result = new RedirectResult("/");//redirect to home page
            }
        }
    }
}

然后将此过滤器应用于操作或控制器
[SessionExpire]
这里的内容远远超出了人们的想象。这里有一个更完整的OnActionExecuting,它使用了上面已经讨论过的相同概念,但添加了更多。有关更多信息,请参阅内联注释。正在调用的“InitializeSession”是一个自定义函数,它创建会话状态中运行站点所需的基本属性。“AlertWarning”是用于显示警报的辅助程序例程。其他一切都是样板代码

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
  var bRequiresAuthorization =
    (filterContext.ActionDescriptor.GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0) ||
    (filterContext.Controller.GetType().GetCustomAttributes(typeof(AuthorizeAttribute), false).Length > 0);

  if (filterContext.HttpContext.Session != null)
  {
    if (filterContext.HttpContext.Session.IsNewSession)
    {
      //New session.  Initialize Session State
      bool b = InitializeSession(null);

      if (bRequiresAuthorization )
      {
        //Action requested requires authorized access.   User needs to authenticate this
        //new session first, so redirect to login
        string cookie = filterContext.HttpContext.Request.Headers["Cookie"];
        if ( (cookie != null) && (cookie.IndexOf("_SessionId=") >= 0) )
        {
          //An expired session cookie still resides on this PC, so first alert user that session is expired
          AlertWarning("Session timed out due to inactivity.  Please log in again.");
        }
        filterContext.Result = RedirectToAction("LogOut", "Authentication");
      }
    }
  }

  base.OnActionExecuting(filterContext);

}

样板VisualStudioMVC应用程序就是这样做的。我建议你看看。谢谢大卫。我找不到。任何链接都将不胜感激。谢谢。我已经编辑了你的问题,使之更切题,并使用了相关的标签。+1。您可能需要检查请求是否为ajax,然后将内容类型设置为“text/javascript”,并将响应主体设置为“document.location='redirecturi'”@jgauffin我是mvc新手,因此您可以给出“document.location='redirecturi”的示例代码,如何操作?授权筛选器与会话超时无关。