2011-06-30 83 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); 

}