2010-07-27 81 views
2

我有一個客戶過濾器屬性來檢查我的.Net MVC應用程序中的過期會話,它可以在標準html表單上正常工作。但是,當我將該屬性應用於由Ajax表單調用的操作並且會話過期時,它會將登錄頁面(filter屬性重定向上下文的位置)重新加載到ajax更新容器中。有誰知道如何讓整個頁面重定向到登錄頁面的方式,如果會話過期了,當ajax調用或有人知道如何處理這種情況更優雅一點?提前致謝。.net mvc&ajax表單 - 如何處理會話過期

public class SessionExpiredFilterAttribute : ActionFilterAttribute 
    { 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      HttpContext ctx = HttpContext.Current; 

      // check if session is supported 
      if (ctx.Session != null) 
      { 

       // check if a new session id was generated 
       if (ctx.Session.IsNewSession) 
       { 

        // If it says it is a new session, but an existing cookie exists, then it must 
        // have timed out 
        string sessionCookie = ctx.Request.Headers["Cookie"]; 
        if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) 
        { 
         //SessionHelper.AddPageMessage("message", "Your session has expired. Please login to continue"); 
         ctx.Response.Redirect("~/Account/Logon"); 
        } 
       } 
      } 


      base.OnActionExecuting(filterContext); 
     } 
    } 
+1

我正在尋求這個答案。 – CedricB 2010-11-27 22:30:07

回答

0

我發佈了這個原始問題,我想我終於找出了一個解決方案。儘管它不如我所希望的那麼優雅,但它起作用(這比我迄今爲止發現的要多)。解決方案圍繞OnBegin AjaxOption和一些Jquery。我的ActionLink(也有可能是,這是適用於Ajax.BeginForm)看起來像這樣

<%= Ajax.ActionLink("Do Ajax Function", "AjaxAction", new { }, new AjaxOptions { OnBegin="check_session", OnSuccess = "ajaxSuccess", UpdateTargetId = "update_container"}, new { })%> 

我在我的賬戶控制器的控制器操作,檢查會議,在我的情況下,我存儲用戶對象,我檢查它是否爲空,並返回「True」或「False」作爲內容。 OutputCache非常重要,否則您的結果將被緩存。

[OutputCache(Duration=0, VaryByParam="None")] 
     public ActionResult CheckAjaxSessionExpired() 
     { 

      bool _sessionExpired = false; 
      if (Session["User"] == null) 
      { 
       _sessionExpired = true; 
      } 

      return Content(_sessionExpired.ToString()); 
     } 

最後一部分是被指定爲OnBegin處理程序check_session功能。 Jquery ajax調用會觸發會話檢查操作並檢查響應。如果回覆爲「真」(表示會話已過期),則會將頁面的位置設置回主頁(在這種情況下爲谷歌)。

function check_session(){ 

     var url = '<%= Url.Action("CheckAjaxSessionExpired", "Account") %>'; 


     //GET CHECK SESSION 
     $.ajax({ 
      url: url, 
      success: function(data) { 

       //alert(data); 

       if (data == "True"){ 
        document.location = "http://www.google.com"; 
       } 
      }, 
      error: function() { alert("there was a problem loading the ajax session check"); } 
     }); 
    } 

如果使用這種方法,有幾件事情要記住。 首先是這將異步運行。如果您有數據敏感的代碼,那麼您仍然需要對會話執行服務器端檢查。如果會話在ajax調用期間過期,此代碼旨在重定向到登錄頁面(或主頁)。 第二件事是check_session函數將需要連接到所有Ajax調用的OnBegin事件中。 如果有人有任何提示或建議改善這種方法,我很樂意聽到他們。我希望這有助於某人。