ajax リクエストで、サーバー側の応答が 302 Found の場合、このステータス コードは ajax コールバック関数で取得できますか?リダイレクトのために応答ヘッダーから Location 値を取得できますか?実際の状況を見てみましょう。
jquery の $.ajax() を使用して ajax リクエストを開始する JavaScript コードは次のとおりです:
$.ajax({
url: '/oauth/respond',
type: 'post',
data: data,
complete : function(jqXHR){
console.log(jqXHR.status);
},
エラー: function (xhr) {
console.log(xhr.status);
}
});
サーバーが 302 Found 応答を返すと、ブラウザーでの実行結果は次のようになります:
ajax の complete() および error() コールバック関数で取得されるステータス コードは、どちらも 302 ではなく 404 です。
これはなぜですか?
stackoverflow で見つかりました
ブラウザが自動的にリダイレクトを処理するため、XHR コールバックを使用してリダイレクトを処理することはできません。リダイレクトされた場所にあるもののみが返されます。
サーバーが送信したときであることがわかります。ブラウザへの 302 応答 ブラウザを使用する場合、ブラウザは ajax コールバック処理を直接実行しませんが、最初に 302 リダイレクトを実行します。つまり、応答ヘッダーから場所情報を読み取り、その後、場所内の URL にリクエストを送信します。このリクエストに対するレスポンスを受信すると、ajaxコールバック処理を実行します。一般的なプロセスは次のとおりです:
ブラウザ -> 302 -> ブラウザ -> ajax コールバックProgram では、302 によって返されるリダイレクト URL にはサーバー上に対応するハンドラーがないため、ajax コールバック関数で取得される 404 ステータス コードは 200 になります。対応する URL が存在する場合、取得されるステータス コードは 200 です。
そのため、Ajax リクエストの 302 レスポンスに基づいて location.href 経由でリダイレクトしたい場合、それは実現できません。
どうやって解決しますか?
方法 1
引き続き ajax を使用し、サーバー側のコードを変更し、元の 302 応答を json 応答に変更します (次の ASP.NET MVC サンプル コードなど)。 >
return Json(new { status = 302, location = "/oauth/respond" }) ;
Ajax コードは少し変更できます:
$.ajax({
url: '/oauth/respond',
type: 'post',
data: data 、
dataType: 'json'、
成功: function (data) 🎜>
方法 2
ajax の代わりにフォームを使用します。
コードをコピー
コードは次のとおりです: