JQuery CORS和重定向

时间:2013-01-25 22:44:04

标签: javascript jquery ajax cors

使用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请求的人?

2 个答案:

答案 0 :(得分: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 = true JS代码)。

答案 1 :(得分: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->所有标签中,您是否看到GET请求或OPTIONS请求?