7

jQuery ajax 呼び出し (get および post) を行いながら、html5、jQuery(1.8.2)、および jQuery mobile を使用してモバイル サイトを開発しています。
ドメイン名を変更した後、ie9 での ajax 呼び出しに対して「アクセスが拒否されました」というメッセージが表示されます。
を含めてみましたjquery.iecors.js。しかし、それでも同じエラーが発生します。これに対する解決策はありますか?

サンプルコード:

$.support.cors = true;

$.ajax({
    cache: false,
    async: true,
    crossDomain: true,
    timeout: 600000,

    url: baseUrl + '/SmartTouch/restServices/PrefferedHotels',
    type: 'GET',

    beforeSend: function (xhr) {
        xhr.setRequestHeader("Authorization", "Basic " + myencoded);
    },
    contentType: "application/x-www.form-urlencoded; (http://www.form-urlencoded;) (http://www.form-urlencoded;) charset=UTF-8",
    success: function (data) {

        alert("success");
    },
    error: function (jqXHR, textStatus, errorThrown) {


        alert("error!!::" + JSON.stringify(jqXHR));

        alert('response: ' + jqXHR.responseText);
        alert('code: ' + jqXHR.getResponseHeader('X-Subscriber-Status'));
        alert("textStatus " + textStatus);
        alert("errorThrown " + errorThrown);

    }
});

編集:

beforeSend: function (xhr) {
    xhr.setRequestHeader("Authorization", "Basic " + myencoded);
    xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
    xhr.setRequestHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS");
},
contentType: "application/x-www.form-urlencoded; (http://www.form-urlencoded;) (http://www.form-urlencoded;) charset=UTF-8",
success: function (data) {
    alert("success");
},
error: function (jqXHR, textStatus, errorThrown) {
    alert("error!!::" + JSON.stringify(jqXHR));

IE9 の要求ヘッダーと応答ヘッダー:

 Request:
    Key Value
    Request GET url HTTP/1.1
    Accept  text/html, application/xhtml+xml, */*
    Accept-Language en-US
    User-Agent  Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
    Accept-Encoding gzip, deflate
    Proxy-Connection    Keep-Alive
    Host     ("url")
    Pragma  no-cache
    Cookie  GUEST_LANGUAGE_ID=en_US; COOKIE_SUPPORT=true; __utmc=24444716; __utma=24444716.47018335.1379597653.1380274476.1380276859.17; __utmz=24444716.1379597653.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=24444716.6.10.1380276859 





    Response:
    Key Value
    Response    HTTP/1.1 200 OK
    Server  Apache-Coyote/1.1
    X-Powered-By    Servlet 2.5; JBoss-5.0/JBossWeb-2.1
    Accept-Ranges   bytes
    ETag    W/"64578-1380266616000"
    Last-Modified   Fri, 27 Sep 2013 07:23:36 GMT
    Content-Type    text/html
    Date    Fri, 27 Sep 2013 10:17:01 GMT
    Content-Length  64578
    Age 0
    Via 1.1 localhost.localdomain 
4

6 に答える 6

2

この種はContent-Type奇妙に見えます:

application/x-www.form-urlencoded; (http://www.form-urlencoded;) (http://www.form-urlencoded;) charset=UTF-8"

IEに問題があると想像できます。

適切なものを試してください:

application/x-www-form-urlencoded; charset=UTF-8
                 ^-- notice: no dot!

また、IE で認証に問題が発生する可能性もあります。範囲myencoded外であるか、正しく入力されていない可能性があります。この変数をデバッグし、次の質問を見てください: setRequestHeader による承認

于 2013-09-26T09:49:36.310 に答える
1

この問題は提案された jQuery のバグとは何の関係もないと確信しているようです (特に を使用しているjquery.iecors.jsため)。

  • 「編集済み」ビットの意味は何ですか? Access-Control-Allow-Origin:*要求ではなく、応答 (つまり、Apache/IIS/F5 構成の一部としてのサーバー側) に設定する必要があります。編集: MDNで利用可能な詳細情報があります。構成の変更にすぐにアクセスできない場合は、burpの改ざんプロキシのようなものを使用してヘッダーを操作することもできます (エンタープライズ環境ではかなり一般的です)。

  • 問題ではないにしても、@DanFromGermany は完全に正しいです - content-type奇妙に見えます。手動で設定する必要さえないはずjQuery.ajax()です。デフォルトで正しいです。

  • 基本認証ヘッダーの設定にも関心があるようです。値はエンコードされているmyencoded(暗号化されていない) だけなので、ヘッダーをスキップして URL に資格情報を渡すこともできます。http(s)://username:password@www.example.com/

モアー編集:

上記の MDN docos を見ると、これは関連しているようです:

デフォルトでは、クロスサイト XMLHttpRequest 呼び出しでは、ブラウザーは資格情報を送信しません。XMLHttpRequest オブジェクトを呼び出すときに、特定のフラグを設定する必要があります。

おそらくあなたに追加xhr.withCredentials = true;してみてくださいbeforeSend

重要な注意:認証されたリクエストに応答する場合、サーバーはドメインを指定する必要があり、ワイルドカードは使用できません。ヘッダーが Access-Control-Allow-Origin: * のようにワイルドカード化されている場合、上記の例は失敗します。Access-Control-Allow-Origin がhttp://foo.exampleを明示的に言及しているため、資格情報を認識するコンテンツが呼び出し元の Web コンテンツに返されます。

これにより、ヘッダーでアスタリスクを使用するという以前のアドバイスが無効になります (つまり、明示的なドメインが必要です)。

于 2013-09-27T04:36:23.890 に答える
1

Ajax url を任意のドメインからヒットさせたい場合、サーバーは応答ヘッダーAccess-Control-Allow-Origin : * または Access-Control-Allow-Origin : your-domain (ドメインのみに制限されている場合) を送信する必要があります。応答にこれらのヘッダーが表示されますか?

于 2013-09-23T06:59:25.240 に答える
0

これを試すことができます

<meta http-equiv="X-UA-Compatible" content="IE=Edge" >

最新バージョンの標準が何であれ、ブラウザーにレンダリングを強制します。参照http://msdn.microsoft.com/en-us/library/ie/ms533876%28v=vs.85%29.aspx

于 2013-09-27T07:08:01.820 に答える
0

Windows ベースのホスティングを使用していた場合は?

利用可能な場合は、IIS の古い構成を確認してください。

タイプごとにコンテンツを許可するセキュリティ規定があります。

この応答ヘッダー<% Response.AddHeader("Access-Control-Allow-Origin","*") %>もページに追加してください。

詳細については、MSDN へのソース リンクを参照してください。

編集でこれを更新したと思いますが、AJAX が関係しているため多くのことがあり、デフォルトではなくセキュリティ オプションを変更した場合、IE9 も理由の 1 つになる可能性があります。

そうすべきだと思います、そうでない場合は返信してください

于 2013-09-26T08:56:56.540 に答える