为什么jquery的.ajax()方法没有发送我的会话cookie?

use*_*625 326 cookies ajax session jquery

登录$.ajax()到站点后,我尝试$.ajax()向该站点发送第二个请求 - 但是当我检查使用FireBug发送的标头时,请求中不包含会话cookie.

我究竟做错了什么?

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中的一个错误(或者至少是下一版本中的功能).

更新:

  1. 不会自动从AJAX响应中设置Cookie(引用:http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login-experience/)

    为什么?

  2. 您无法从响应中获取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

  • 好极了!我在服务器端添加使用此+ set Access-Control-Allow-Credentials标头为true (8认同)
  • 谢谢你的回答:)只是一个快速添加,可能值得一提"重要提示:在响应有证书的请求时,服务器必须指定一个域,并且不能使用外来梳理.如果标头通配符为以下示例将失败:Access-Control-Allow-Origin:*`https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials (3认同)

flu*_*flu 209

如果您调用的URL与您的调用脚本位于同一域中,则AJAX调用仅发送Cookie.

这可能是跨域问题.

也许您www.domain-a.com在调用脚本打开时尝试调用URL www.domain-b.com(换句话说:您进行了跨域调用,在这种情况下,浏览器不会发送任何cookie来保护您的隐私).

在这种情况下,您的选择是:

  • 编写一个驻留在domain-b上的小代理,并将您的请求转发给domain-a.您的浏览器将允许您调用代理,因为它与调用脚本位于同一服务器上.
    然后,您可以配置此代理接受可以发送到域-a的cookie名称和值参数.但要实现这一目标,您需要知道cookie的名称并重视域上的服务器 - 需要进行身份验证.
  • 如果您正在获取JSON对象,请尝试使用JSONP请求.jQuery支持这些.但是你需要在domain-a上改变你的服务,以便它返回有效的JSONP响应.

很高兴,如果这有助于甚至一点点.

  • 还值得注意的是,cookie可以设置为特定的路径,因此如果您使用`path =/something`设置cookie并且您正在请求页面`/ another`,那么cookie将不会被发送.当您请求页面`/ something`时,cookie将按预期发送.因此,请检查设置cookie的代码. (19认同)
  • 根据维基百科上的[JSONP](https://en.wikipedia.org/wiki/JSONP)>这种方法被放弃,转而支持CORS (4认同)
  • 一个jsonp请求发送coockies? (2认同)
  • “Cookie/会话信息未发送”使我的登录代码停止工作。我被困了几个小时,而不知道我正在“0.0.0.0:5000”浏览网页并向“localhost:5000”发出 AJAX 请求,并认为它们是相同的。事实上它们并不相同!感谢您拯救了我的编码生活 (2认同)

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 次

最近记录:

5 年,12 月 前