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

显然,如果我可以让它工作,我会限制Origin。

有谁知道使用JQuery需要什么? 它是一个JQuery问题,还是一个经历过所有Ajax + CORS请求的问题?

您不能将Access-Control-Allow-Origin: *Access-Control-Allow-Credentials: true结合使用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代码)。

尝试在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请求?