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

10 浏览
0 Comments

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

通过$.ajax()登录某个网站后,我正在尝试向该网站发送第二个$.ajax()请求 - 但是当我使用FireBug检查发送的头信息时,请求中没有包括会话cookie。

我做错了什么?

admin 更改状态以发布 2023年5月23日
0
0 Comments

只有当你调用的URL和你的调用脚本位于同一域名下时,AJAX调用才会发送Cookies。

这可能是跨域问题。

也许你试图从www.domain-a.com调用一个URL,而你的调用脚本在www.domain-b.com上(换句话说:你进行了一个跨域调用,在这种情况下,浏览器不会发送任何Cookies以保护你的隐私)。

在这种情况下,你有以下选项:

  • 编写一个小代理,驻留在domain-b上,并将你的请求转发到domain-a。你的浏览器将允许你调用代理,因为它与调用脚本在同一服务器上。
    然后,你可以配置这个代理来接受一个cookie名称和值参数,它可以发送到domain-a。但是,要使这个工作正常,你需要知道domain-a上的服务器想要用于身份验证的cookie名称和值。
  • 如果你正在获取JSON对象,请尝试使用JSONP请求。jQuery支持这些请求。但是,你需要修改domain-a上的服务,使其返回有效的JSONP响应。

如果这些对你有帮助,我会很高兴的。

0
0 Comments

我正在跨域场景中操作。在登录过程中,远程服务器返回了一个设置了Access-Control-Allow-Credentials 为 true 的 Set-Cookie 的头信息。

下一次向远程服务器发送的 ajax 调用应该使用这个 cookie。

CORS 的 Access-Control-Allow-Credentials 是为了允许跨域登录。请参考 https://developer.mozilla.org/En/HTTP_access_control 获取示例。

对我来说,这似乎是 JQuery 的一个 bug(或至少是下一个版本将要添加的功能)。

更新:

  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" 参数。

答案:
你应该使用 xhrFields 参数和http://api.jquery.com/jQuery.ajax/

文档中的示例是:

$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});

同样重要的是,服务器必须正确地响应这个请求。这里把 @Frédéric 和 @Pebbl 的非常好的评论复制在这里:

重要提示:在响应认证请求时,服务器必须指定一个域名,不能使用通配符。如果响应头被通配为:Access-Control-Allow-Origin: *,上面的示例将失败。

所以请求是:

Origin: http://foo.example
Cookie: pageAccess=2

服务器应该响应:

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true
[payload]

否则,负载数据将不会返回到脚本。参见:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials

0