2012-10-03 40 views
7

從ajax調用函數時。程序流程無法識別已過期的會話,即未重定向到登錄頁面。取而代之的是,它保存了記錄。我正在使用c#.net mvc。那麼我怎樣才能處理會話,而阿賈克斯調用。在這裏,我給了我的代碼。當ajax調用C#mvc控制器不工作時處理會話超時

$.ajax({ 
      type: "POST", 
      url:'/Employee/SaveEmployee', 
      data: 
      { 
       Location:$("#txtLocation").val(), 
       dateApplied:$("#txtDateApplied").val(), 
       Status:$("#ddStatus").val(), 
       mailCheck:$("#ddMailCheck").val(), 
       ... 
       ... 
       ... 
      }, 
      success: function (result) 
      { 

      }, 
      error: function (msg) 
      { 
      } 
     }); 

這裏控制器

[Authorize] 
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...) 
{ 
     objEmpMain.FirstName = firstName; 
     objEmpMain.LastName = lastName; 
     objEmpMain.Initial = Initial; 
     objEmpMain.Address1 = Address; 
     ... 
     ... 
     ... 
} 

回答

23

您的AJAX調用仍然有可能最終出現成功的結果(雖然,不用擔心,它不會真正執行你的操作方法),以及調用你的success處理程序。這是因爲您期待HTML,而這正是您所接收的內容(儘管生成的HTML可能是您的登錄頁面,而不是您想要的HTML)。另外,如果你期望JSON(使用dataType:'JSON'),它會觸發一個錯誤,因爲它會將HTML解析爲JSON。

你需要做的是防止FormsAuth重定向AJAX請求的登錄頁面。現在,AuthorizeAttribute忠實地返回一個NotAuthorizedResult,它向客戶端發送HTTP 401 Not Authorized響應,這對於您的AJAX客戶端來說非常理想。

問題是FormsAuth模塊檢查StatusCode,如果它是401,它將執行重定向。我已經防治的這樣這個問題:

1)創建我自己的衍生物類的AuthorizeAttribute是放置一個標誌HttpContext.Items讓我知道授權失敗,我要強迫一個401,而不是重定向:

public class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    /// <summary> 
    /// Processes HTTP requests that fail authorization. 
    /// </summary> 
    /// <param name="filterContext">Encapsulates the information for using <see cref="T:System.Web.Mvc.AuthorizeAttribute"/>. The <paramref name="filterContext"/> object contains the controller, HTTP context, request context, action result, and route data.</param> 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) filterContext.HttpContext.Items["AjaxPermissionDenied"] = true; 

     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

2)添加到您的Global.asax.cs:

protected void Application_EndRequest(Object sender, EventArgs e) 
    { 
     if (Context.Items["AjaxPermissionDenied"] is bool) 
     { 
      Context.Response.StatusCode = 401; 
      Context.Response.End(); 
     } 
    } 

3)添加的StatusCode處理您的jQuery AJAX設置:

$.ajaxSetup({ 
    statusCode: { 
     401: function() { 
      window.location.href = "path/to/login"; 
     } 
    } 
}); 

4)更改您要使用AuthorizeAttributeAjaxAuthorizeAttribute這種行爲的控制器或動作:

[AjaxAuthorize] 
public string SaveEmployee(string Location, string dateApplied, string Status, string mailCheck, ...) 
{ 
     objEmpMain.FirstName = firstName; 
     objEmpMain.LastName = lastName; 
     objEmpMain.Initial = Initial; 
     objEmpMain.Address1 = Address; 
     ... 
     ... 
     ... 
} 
+0

其實我現在的類看起來像下面的「公共類EmployeeController:控制器」。你是否指示我改變如下「公共類AjaxAuthorizeAttribute:AuthorizeAttribute」? –

+1

只需換出您在控制器或控制器操作上修飾的'AjaxAuthorizeAttribute'的'AuthorizeAttribute'即可。見我剛剛添加的#4。 – HackedByChinese

+0

對不起,你能解釋一下我在哪裏需要創建「public class AjaxAuthorizeAttribute:AuthorizeAttribute」類? –

1

我想sugguest您使用的StatusCode = 306 我遇到了一些問題,當使用401。 IIS對待401與我所瞭解的不同。 306適合我。

問候。