質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.09%

jQueryのajaxでクロスドメイン通信した時にHTTPステータスコードが変

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 7,436

score 159

jQueryのajaxでクロスドメイン通信した時に、レスポンスのHTTPステータスコードを参照し、 その後の処理を分けたいのですが、期待しているHTTPステータスコードが取得できません。

例えば、あえて401(Unauthorized)を返すような通信を行い、 GoogleChromeの開発者ツールのNetworkタブで見ますと401(Unauthorized)が返ってきていますが、これをJavaScriptのコード上で参照しますと、404(NotFound)が格納されています。

jQueryのajaxではレスポンスのHTTPステータスコードは変換されているのでしょうか? このような場合でJavaScriptのコード上で401を取得する方法はありますでしょうか?

クライアントサイド:JavaScrip + jQuery2.0.3

サーバサイド:Apach2.2.3 + Tomcat6 + Java7

クロスドメイン対策はしており、通常時は通信は成功しています。 クライアント側、サーバ側共に、設定などの変更は可能な環境です。

以下、クライアント側の呼出し部のコードです。

$.ajax({
    url:            "http:xxxxx.com",
    async:            true,
    type:            inType,
    cache:            false,
    contentType:    contentType,
    data:            data,
    timeout:        60000,
    xhrFields: {
        withCredentials:    true,
    },
    statusCode: {
        401: function() {
            console.log("call 401");
        },
        403: function() {
            console.log("call 403");
        },
        404: function() {
            console.log("call 404");
        },
        200: function() {
            console.log("call 200");
        }
    },
}).done( function (inRecv, inStatus, inXhr) {
    console.log("done: inStatus=" + inStatus + " readyState=" + inXhr.readyState + " status=" + inXhr.status + "(" + inXhr.statusText + ")");
    return 0;

}).fail( function (inXhr, inStatus, inError) {
    console.log("fail: inStatus=" + inStatus + " readyState=" + inXhr.readyState + " status=" + inXhr.status + "(" + inError + ")");
    return 0;

}).always( function (inArg1, inStatus, inArg2) {
    console.log("alwaysFail: inStatus=" + inStatus + " readyState=" + inArg1.readyState + " status=" + inArg1.status + "(" + inArg2 + ")");
    console.log("alwaysDone: inStatus=" + inStatus + " readyState=" + inArg2.readyState + " status=" + inArg2.status + "(" + inArg2.statusText + ")");
    return 0;

});

画像はGoogleChromeの開発者ツールのスクリーンショットです。 401のハズが、コンソール出力を見ますと404で格納されています。 401なのに 404が返る

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

当方の環境で Chrome と Firefox で試しましたが、jqxhrも401を返しました。

Chrome のエラーメッセージを拝見しましたが、 No 'Access-Control-Allow-Origin' header とあり、 Same-Origin Policy 違反により、サーバまでリクエストが行ってないのではないかと思いました。 そこで試しに Same-Origin Policy 違反になる teratail にリクエストを飛ばしてみたところ、jqxhrは404を返しました。

おそらくローカル環境からWEBサーバにリクエストをしているのが原因なのでは。

 

追記

コメントに返信。

ただ、サーバ側にてApacheのaccess.logを監視していますと、401でログ出力されており、リクエストはサーバ側へ届いているようです。サーバ側は確かに401を返しているのですが、どこで404に変換されているのか…。

CORSの仕様によりますと、

The getResponseHeader() method of XMLHttpRequest will therefore not expose any header not indicated above.
Cross-Origin Resource Sharing

とあります。おそらくセキュリティ上の理由からだと思いますが、Same-Origin Policy 違反の場合、クライアントはレスポンスヘッダをフィルタすることが仕様のようです。ステータスコードについてはそのような明示的な記述はありませんが、同様に処理されるのが妥当のように思えます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/09 12:17

    追記ありがとうございます。サーバ側の設定も色々試しましたが、改善できず。ご指摘通りCORSだとフィルタされた結果しか取得できないのかな…。何か別な対応を検討してみます…。ご回答ありがとうございました。

    キャンセル

  • 2015/12/09 14:54

    御理解された上で書いてらっしゃるのかもしれませんが、一応指摘しておきますと、

    > CORSだとフィルタされた結果しか取得できない

    これは間違いで、CORSでアクセスしたがoriginが許可されていない場合はヘッダを隠ぺいする、というのが仕様です。正しくCORSを使用していれば問題なく動作するはずです。

    キャンセル

  • 2016/02/04 21:29

    問題は解決には至っていませんが、大変参考になりました。
    日付も大分経過しましたので、Lhankor_Mhyさんをベストアンサーとさせて頂き、この質問はCLOSEしておきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る