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");

显然,当/如果我能让它工作时,我会限制原点。

有谁知道使用 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"));

或者,您可以删除Access-Control-Allow-Credentials: true标题(连同withCredentials = trueJS 代码)。

于 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 回答