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请求?