【问题标题】:How to handle Session timeout in MVC 3如何处理 MVC 3 中的会话超时
【发布时间】:2011-09-25 22:10:54
【问题描述】:

我遇到了频繁的会话超时问题。

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

【问题讨论】:

  • 样板 Visual Studio MVC 应用程序执行此操作。我建议看看它。
  • 谢谢大卫。我找不到它。任何链接将不胜感激。谢谢
  • 我已经编辑了您的问题,使其更切中要害,并使用相关的标签。

标签: asp.net-mvc session-timeout action-filter


【解决方案1】:

你可以试试这样的:

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
                }
            }
        }
    }
}

【讨论】:

  • +1。您可能想检查请求是否为 ajax,然后将 content-type "text/javascript" 和响应正文设置为 "document.location = 'redirecturi'"
  • @jgauffin 我是 mvc 的新手,所以你能给出“document.location = 'redirecturi”的示例代码吗,怎么办?
【解决方案2】:

这里有比眼前所见更多的东西。这是一个更完整的 OnActionExecuting,它使用了上面已经讨论过的相同概念,但添加了更多内容。有关详细信息,请参阅内联 cmets。被调用的“InitializeSession”是一个自定义函数,它创建会话状态中运行站点所需的基本属性。 “AlertWarning”是一个用于显示警报的 Helper 例程。其他都是样板代码。

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);

}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 授权过滤器与会话超时无关。
    【解决方案4】:

    如上所述..试试这个

    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]

    【讨论】:

      猜你喜欢
      • 2017-10-06
      • 2016-03-27
      • 2012-11-10
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多