XMLHttpRequest を送信するときにブラウザがリダイレクトをたどらないようにすることは可能ですか (つまり、リダイレクト ステータス コードを取得して自分で処理します)?
6 に答える
XMLHttpRequestオブジェクトのW3C標準に準拠していません(強調が追加されています)。
応答がHTTPリダイレクトの場合:
Locationヘッダーによって伝達されるURLのオリジンがXMLHttpRequestオリジンと同じオリジンであり、リダイレクトが無限ループの予防措置に違反していない場合は、同じオリジンのリクエストイベントルールを遵守しながら、リダイレクトを透過的に実行します。
彼らは将来のリリースのためにそれを検討していました:
この仕様には、この仕様の将来のバージョンで検討されている次の機能は含まれていません。
- 次のリダイレクトを無効にするプロパティ。
しかし、最新の仕様ではこれについては言及されていません。
プロパティを使用responseURL
して、リダイレクト先を取得したり、応答が受け入れた場所から最終的にフェッチされたかどうかを確認したりできます。
もちろん、これはとにかく結果がフェッチされることを意味しますが、少なくともリダイレクト先に関する必要な情報を取得し、たとえば応答を破棄したい場合の条件を検出できます。
いいえ、XMLHttpRequest によって公開される API には、301 または 302 を自動的に追跡するデフォルトの動作をオーバーライドできる場所はありません。
クライアントが Windows で IE を実行している場合は、代わりに WinHTTP を使用してその動作を防止するオプションを設定できますが、これは非常に限定的な解決策です。
他のコメントで回答されているように、クライアント側でリダイレクトまたは 302 ステータスを処理することはできません。ただし、リダイレクトを防ぐことはできます。これを行うには、リクエストヘッダー「X-Requested-With」を「XMLHttpRequest」で設定できます xhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest"); これは、開封後、送信前に行う必要があります。以下の例
let xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
reqObj.success(JSON.parse(this.responseText))
} else if (this.status != 200) {
reqObj.error(this.statusText)
}
};
xhttp.open(reqObj.type, reqObj.url, reqObj.async);
xhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhttp.send();