2011-06-30 45 views
3

我有频繁的会话超时问题。如何处理会话超时在MVC 3

我想写我可以每个控制器上使用共同的过滤器,过滤器应该将用户重定向到登录,登录回从那里用户发送的最后一个请求后。

+1

样板Visual Studio的MVC应用程序做到这一点。我建议看看它。 –

+1

谢谢大卫。我无法找到它。任何链接将不胜感激。感谢 – vivek

+0

我已经编辑你的问题,使之更重要的一点,并使用标签与自己相关。 – jgauffin

回答

5

你可以尝试这样的事:

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

+1。您可能要检查,如果该请求是AJAX,然后设置内容型'“文/ JavaScript的”'和响应身体'“document.location =‘redirecturi’”'。 – jgauffin

+0

@jgauffin我在MVC新的,这样你们可以给“document.location =“redirecturi”示例代码,怎么办? –

0

你试过现有授权过滤器?

+0

授权过滤器与会话超时无关。 –

0

如上所述..尝试这个

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]

1

还有更多这里比满足眼睛应用此过滤器。这是一个更完整的OnActionExecuting,它使用了上面已经讨论过的相同的概念,但增加了一些。有关更多信息,请参阅行内评论。被调用的“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); 

}