web-dev-qa-db-ja.com

Ajaxで302リダイレクトを処理できないのはなぜですか?

フォーム認証を使用してasp.net mvcで記述されたバックエンドサーバーがあります。ユーザーが認証されない場合、サーバーは自動的に302リダイレクトをログインアクションに送信し、ログインページを返します。

クライアント側には、アイテムのリストがあります。このリストには、認証されたユーザーのみがアクセスできます。このページには、Ajax(jQueryの$ .ajax関数)を使用してリストを更新するボタンがあります。

さて、私の問題は、認証チケットがタイムアウトし、ユーザーが更新ボタンをクリックしたときです。

  • 私の関数は、更新されたリストを取得するためにajaxリクエストを送信します
  • サーバーは、認証チケットが無効であることを検出し、302リダイレクトを発行します。
  • ブラウザ自動的には302応答を処理し、ajax関数がログインアクションに別のajaxリクエストを送信するよう強制します。最終結果はステータス200のHTMLです。リストもHTMLであるため、スクリプトが混乱していますステータス200。

私が欲しいのは、認証チケットがタイムアウトになり、ユーザーが[更新]ボタンをクリックすると、それを検出し、ユーザーにログインを求めるメッセージを表示できるようにすることです。

ログインアクションにカスタムヘッダー(IS_LOGIN)を追加してこれを回避し、ajax応答で確認しました。しかし、それは良い解決策ではありません。

だから私の質問は:

  • この問題に対処する最良の方法は何ですか?
  • ブラウザーがスクリプトで302応答を処理できないのはなぜですか?そして、ajaxに別のリクエストを自動的に作成させるだけです。これはブラウザまたはjqueryライブラリの問題ですか?これには理由がありますか? (セキュリティ、...)

返信いただきありがとうございます。

40
Khanh TO

XHRの場合は呼び出しをリダイレクトするのではなく、401 Unauthorizedで応答し、コールバックでこれを処理する必要があります。 ASP.NETについては知りませんが、Spring Securityで同様のことをしました。

概念は次のとおりです。

  • 認証済み状態を取得する
  • X-Requested-With: XMLHttpRequestのヘッダーを確認します
  • 認証されていない場合、401 Unauthorizedで応答します
  • 見つからず、認証されていないリダイレクト。

結論として、XHR呼び出しは、場合によっては他のHTTP要求とは異なる方法で処理する必要があります。同じリソースが別の場所にある場合にのみ、XHRをリダイレクトする必要があります。

あなたの質問に答えるために

ブラウザが自動的にリダイレクトを処理するため、XHRコールバックでリダイレクトを処理できません。リダイレクトされた場所でのみ何を取得します。

39
Bart