2011-09-18 8 views
26

XMLHttpRequest.getResponseHeader()の結果が返された実際のヘッダーと一致するとは限りません(リクエストが通常の方法で行われた場合)。XMLHttpRequestのgetResponseHeader()の制限?

たとえば、のxhrリクエストを作成しているとします。 Chromeのデベロッパーコンソールで、[ネットワーク]の下にレスポンスが表示されます(すべてのレスポンスヘッダー(10など)も表示されます)。ただし、コピー貼り付けコンソール:

> response 
    XMLHttpRequest 
> response.getAllResponseHeaders(); 
    "content-type: text/html 
    " 

利用できるヘッダーには制限がありますか?これは応答タイプに依存していますか?私は404のヘッダーの完全なセットを取得することを覚えていますが、これは400のためだけです。

何がありますか?

+0

私は 'http:// stackoverflow。com/'このページでは、すべてのヘッダーを戻すことができます。私はどのように再現するか分からない。 – pimvdb

+0

私は漠然としていることを知っています - 適切なケースに絞ろうとしています。オリジナルの要求は、Access-Control-Allow-Originを使用してクロスオリジン要求です。急いで質問の急いで感じることを許して、すぐに詳しく説明します:私はこれをさらに瞬時に調査する時間がありませんでした。私はこれが何か知られていない制限だと思っていました。 – maligree

答えて

34

のみのSet-Cookieセット-Cookie2ヘッダフィールドへのアクセス制限はないXMLHttpRequest APIを標準の現在の状態:

クライアント .getAllResponseHeaders()

フィールド名がSet-CookieまたはSet-Cookie2のレスポンスからすべてのヘッダーを返します。

他のヘッダーフィールドを返す必要があります。

のXMLHttpRequestレベル2の仕様では、とXMLHttpRequestオブジェクトを強化する:あなたは、クロスオリジン・リクエストをやっているよう

はしかし、ブラウザは元のXMLHttpRequestのみ同一生成元の要求を許可しないようXMLHttpRequest Level 2を実装する必要がありますこうしたクロスオリジン・リクエストなどの新機能、[...]があり

あなたは「Cross-Origin Resource Sharing specificationが非same-origin要求に対してgetResponseHeader()によって公開されているヘッダをフィルタリングヘッダをフィルタリングする。」ことを読み取ることができます。そして、その仕様はsimple response header fields(すなわちのCache-Controlコンテンツ言語のContent-Type期限、のLast-Modified、およびプラグマ)以外の任意のレスポンスヘッダフィールドへのアクセスを禁止します:

ユーザエージェントは

例えば、[...]簡単なレスポンスヘッダであるもの以外のすべての応答ヘッダを除外しなければなりませんしたがって、XMLHttpRequestのgetResponseHeader()メソッドは、上に示されていないヘッダを公開しません。

+1

よろしくお願いいたします。しかし、私は適切な 'Access-Control-Expose-Headers:'を設定しました.Geckoだけで動作することを知り、WebKitでは動作しません。 WebKitはうれしく「安全でないヘッダ(..)を取得することを拒否しました」と、Geckoは何の問題も見ません。第2の問題: 'getAllResponseHeaders()'があります。私は 'getResponseHeader()'ヘッダを利用できないものとしてリストアップすることができます。 – maligree

+0

@maligree:[WebKitは* Access-Control-Expose-Headers *をまだサポートしていません。](https://bugs.webkit.org/show_bug.cgi?id=41210)しかし、他の問題はどうですか?どんなブラウザですか? – Gumbo

+0

はい、私はバグジラの問題を偶然見つけました - しかし、それが開かれた日付を見て、私は塩の粒でそれを取った。 'getAllResponseHeaders()'は '' ''を返し、 '' getResponseHeader( 'content-length') 'や' 'getResponseHeader( 'www-authenticate' ')は返されますが、 ) '(設定しているヘッダーの1つで、' Access-Control-Expose-Header')は正しいヘッダー値を返します。この時点で使用していたURIを公開するのではなく、後で別のテストケースを作成することができます。 – maligree

3

ヘッダーと、どのヘッダーがブラウザに公開されているのかを防ぐことができるのはAccess-Control-Allow-Originです。 Docs at mozilla