2010-03-01 73 views
1

我嘗試使用下面的代碼登錄用戶:RedirectToRoute(「默認」)和重定向(RETURNURL)正在返回「200」,而不是「302」

$("form").submit(function(event) 
{ 
    $.ajax({ 
     type: "POST", 
     url: $(this).attr("action"), 
     data: $(this).serialize(), 
     complete: function(XMLHttpRequest, textStatus) 
     { 
      if (XMLHttpRequest.status === 302) 
      { 
       // if they've successfully logged in, I redirect to their page 
       window.location = XMLHttpRequest.getResponseHeader("Location"); 
      } 
     } 
    }); 

    return false; 
}); 

用下面的代碼上服務器處理後:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult LogOn(MyUser user) 
{ 
    if (ValidateLogOn(user.UserName, user.Password)) 
    { 
     if (Request.QueryString["ReturnUrl"] != null) 
     { 
      return Redirect(Request.QueryString["ReturnUrl"]); 
     } 
     else 
     { 
      return RedirectToRoute("Default"); 
     } 
    } 
} 

我想這兩個「重定向」操作的結果被認爲發行302S但XMLHttpRequest.status值始終爲200。有什麼我做錯了嗎?

編輯:這是最終的工作

$("form").submit(function(event) 
{ 
    $.ajax({ 
     type: "POST", 
     url: $(this).attr("action"), 
     data: $(this).serialize(), 
     complete: function(xhr, textStatus) 
     { 
      var dataType = xhr.getResponseHeader("Content-Type"); 

      if (dataType.indexOf("json") > -1) 
      { 
       window.location = JSON.parse(xhr.responseText).returnUrl; 
      } 

      if (dataType.indexOf("html") > -1) 
      { 
       $('#main').html(xhr.responseText); 
      } 
     } 
    });    
    return false; 
});  

與服務器上執行以下操作:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult LogOn(MyUser user, string returnUrl) 
{ 
    if (!ValidateLogOn(user.UserName, user.Password)) 
    { 
     return PartialView(); 
    } 
    else 
    { 
     user = (MyUser)Session["CurrentUser"]; 
     if (user.IsPublic) 
     { 
      return Json(new { returnUrl = Url.RouteUrl("PublicRoute") }); 
     } 
     else 
     { 
      if (!string.IsNullOrEmpty(returnUrl)) 
      { 
       return Json(new { returnUrl = returnUrl.ToLower() }); 
      } 
      else 
      { 
       return Json(new { returnUrl = Url.RouteUrl("AdminRoute") }); 
      } 
     } 
    } 
} 

感謝

戴夫

回答

1

您的瀏覽器會自動跟隨重定向並請求r edirect頁面,然後返回200。運行代理(如Fiddler或Charles)來查看我的意思。

我建議返回200狀態,但使用JSON對象來指定您要重定向用戶。

此外,在這種情況下,this answer建議使用狀態278(顯然是一個未使用的狀態碼,這對我來說聽起來很危險)。

相關問題