7

JQuery 1.8.2 の使用

ある AppServer ( Front ) から別の AppServer ( Back ) サーバーに CORS リクエストをアプリに送信しています。Frontから次の Ajax 呼び出しを行うと、Backからの 302 応答 (セキュリティ チェック)は受け入れられますが、JSESSIONID Cookie は保存されません。

$.ajax({
    url : url,
    dataType : 'html',
    success : function(data, status, xhr) {
    $(dataContainer).append(data);
    },
    complete: function(xhr, status, error) {
    if (xhr.status != 200) {
        $.logger(xhr.getResponseHeader('Location'));
        }
    }
});

ここで、同じ呼び出しを行って withCredentials を追加すると、JSESSIONID は正しく保存されますが、302 リダイレクトがドロップされます。Chrome と Firefox の両方 (両方の最新バージョン) は、単にリクエストの処理を停止します。

$.ajax({
    xhrFields: { withCredentials: true },
    url : url,
    dataType : 'html',
    success : function(data, status, xhr) {
    $(dataContainer).append(data);
    },
    complete: function(xhr, status, error) {
    if (xhr.status != 200) {
        $.logger(xhr.getResponseHeader('Location'));
        }
    }
});

xhr オブジェクトからリダイレクト ロケーション ヘッダーを取得しようとしましたが、空です。

Backから出てくるすべての応答に次のように設定しています。

response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
response.setHeader("Access-Control-Max-Age", "1728000");
response.setHeader("Access-Control-Allow-Headers", "Cookie,X-Requested-With");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Expose-Headers", "Location");

明らかに、Origin を機能させることができる場合は、Origin を制限します。

これをJQueryで動作させるために何が必要か知っている人はいますか? JQuery の問題ですか、それともすべての Ajax+CORS リクエストで経験した問題ですか?

4

2 に答える 2

4

Access-Control-Allow-Origin: *との併用はできませんAccess-Control-Allow-Credentials: true。Access-Control-Allow-Credentials が true に設定されている場合、Access-Control-Allow-Origin の値は Origin ヘッダーの値である必要があります。

response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

または、ヘッダーを ( JS コードAccess-Control-Allow-Credentials: trueと共に)ドロップすることもできます。withCredentials = true

于 2013-01-26T04:52:35.743 に答える
1

ajax設定でcrossDomainを追加してみてください。

$.ajax({
    xhrFields: { withCredentials: true },
    url : url,
    dataType : 'html',
    crossDomain: true, 
    success : function(data, status, xhr) {
    $(dataContainer).append(data);
    },
    complete: function(xhr, status, error) {
    if (xhr.status != 200) {
        $.logger(xhr.getResponseHeader('Location'));
        }
    }
});

また使用

jQuery.support.cors = true;

$.ajaxを呼び出す前に。

Firebug-> Net-> Allタブに、GETリクエストまたはOPTIONSリクエストが表示されますか?

于 2013-01-26T06:21:31.320 に答える