jQueryを使用してサーバーにAJAXPOSTリクエストを作成します。これにより、ステータス302のHTTPレスポンスを返すことができます。JavaScriptはこのURLにGETリクエストを送信するだけですが、このレスポンスではユーザーをURLにリダイレクトします。これは可能ですか?
5 に答える
受け入れられた答えは、与えられた理由で機能しません。ブラウザによって透過的に処理される 302 の問題を回避するためのハックを説明する質問へのリンクを含むコメントを投稿しました。
jQuery Ajax 呼び出し後のリダイレクト要求を管理する方法
ただし、これは少し汚いハックであり、多くの掘り下げた後、より良い解決策であると思われるものを見つけました - JSONを使用します。この場合、ajax リクエストへのすべてのレスポンスにコード 200 を持たせ、レスポンスの本文に、ajax レスポンス ハンドラが適切な方法で使用できる何らかの JSON オブジェクトを追加できます。
私はそうは思わない。W3Cは、302 を含む特定のステータス コードを含む HTTP リダイレクトは透過的に追跡する必要があると述べています。以下引用:
応答が HTTP リダイレクト (ステータス コード 301、302、303、または 307) である場合、透過的に従わなければなりません (セキュリティまたは無限ループの予防措置に違反しない限り)。その他のエラー (401 を含む) では、オブジェクトがそのエラー ページを応答として使用する必要があります。
実験として、さまざまなブラウザー (Firefox 3.5、Chrome、IE8、IE7、IE6) からサーバーに対して Ajax リクエストを実行して 302 ステータス コードを返し、ブラウザーのリクエスト オブジェクトにステータスを表示してみました。いずれの場合も、200 と表示されました。
私の問題の理由は次のとおりです。
ページをテストするためにlocalhost/Home/Testアドレスを使用していました。ただし、url パラメーターに127.0.0.1/Home/AjaxRequestを使用する ajax 要求コード 。URL が異なる場合、このエラーが発生します。
多分それは誰かを助ける:)
Javascript コードに 302 を処理するように要求するよりも、302 のイベントでカスタム エラー コード + メッセージを含む 500 を返す方がよいでしょう。
function doAjaxCall() {
$.ajaxSetup({complete: onRequestCompleted});
$.get(yourUrl,yourData,yourCallback);
}
function onRequestCompleted(xhr,textStatus) {
if (xhr.status == 302) {
location.href = xhr.getResponseHeader("Location");
}
}