Kan*_*gur 374
我在跨域方案中运行.在登录期间,远程服务器返回Set-Cookie标头并Access-Control-Allow-Credentials
设置为true.
对远程服务器的下一个ajax调用应该使用此cookie.
CORS Access-Control-Allow-Credentials
是允许跨域日志记录的.有关示例,请访问https://developer.mozilla.org/En/HTTP_access_control.
对我来说,它似乎是JQuery中的一个错误(或者至少是下一版本中的功能).
更新:
不会自动从AJAX响应中设置Cookie(引用:http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/)
为什么?
您无法从响应中获取cookie的值以手动设置它(http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-getresponseheader)
我糊涂了..
应该存在一种要求jquery.ajax()
设置XMLHttpRequest.withCredentials = "true"
参数的方法.
答案:
您应该使用http://api.jquery.com/jQuery.ajax/的xhrFields
参数
文档中的示例是:
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
Run Code Online (Sandbox Code Playgroud)
服务器正确回答此请求也很重要.在这里复制@Frédéric和@Pebbl的精彩评论:
Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *
所以当请求是:
Origin: http://foo.example
Cookie: pageAccess=2
Run Code Online (Sandbox Code Playgroud)
服务器应该响应:
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true
[payload]
Run Code Online (Sandbox Code Playgroud)
否则,有效负载将不会返回到脚本.请参阅:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials
flu*_*flu 209
如果您调用的URL与您的调用脚本位于同一域中,则AJAX调用仅发送Cookie.
这可能是跨域问题.
也许您www.domain-a.com
在调用脚本打开时尝试调用URL www.domain-b.com
(换句话说:您进行了跨域调用,在这种情况下,浏览器不会发送任何cookie来保护您的隐私).
在这种情况下,您的选择是:
很高兴,如果这有助于甚至一点点.
wom*_*ine 47
运用
xhrFields: { withCredentials:true }
Run Code Online (Sandbox Code Playgroud)
作为我的jQuery ajax调用的一部分只是解决方案的一部分.我还需要在我的资源的OPTIONS响应中返回标头:
Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true
Run Code Online (Sandbox Code Playgroud)
重要的是,OPTIONS调用的响应头中只有一个允许的"origin"而不是 "*".我通过从请求中读取原点并将其填充回响应来实现这一点 - 可能绕过限制的原始原因,但在我的用例中,安全性并不是最重要的.
我认为值得明确提到只有一个来源的要求,因为W3C标准允许空格分隔列表 - 但Chrome不会! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header 注意"实践中"位.
小智 39
把它放在你的init函数中:
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
});
Run Code Online (Sandbox Code Playgroud)
它会工作.
小智 12
对这个问题已经有了很多好的回答,但是我认为澄清你希望发送会话cookie的情况可能会有所帮助,因为cookie域匹配,但是由于AJAX请求是被制作到不同的子域.在这种情况下,我被分配到一个cookie *.mydomain.com来域,我希望它被包含在一个AJAX请求different.mydomain.com ".默认情况下,该cookie不会发送.您不需要在会话cookie上禁用HTTPONLY来解决此问题.您只需要执行wombling建议(/sf/answers/1656243291/)并执行以下操作.
1)将以下内容添加到您的ajax请求中.
xhrFields: { withCredentials:true }
Run Code Online (Sandbox Code Playgroud)
2)将以下内容添加到响应标头中,以获取不同子域中的资源.
Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true
Run Code Online (Sandbox Code Playgroud)
小智 6
在尝试了其他解决方案并且仍然无法使之工作之后,我发现了我的问题所在。我将contentType从“ application / json”更改为“ text / plain”。
$.ajax(fullUrl, {
type: "GET",
contentType: "text/plain",
xhrFields: {
withCredentials: true
},
crossDomain: true
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
311195 次 |
最近记录: |