在通过$.ajax()登录到一个网站后,我试图向该网站发送第二个$.ajax()请求-但当我检查使用FireBug发送的报头时,请求中没有会话cookie。
我做错了什么?
在通过$.ajax()登录到一个网站后,我试图向该网站发送第二个$.ajax()请求-但当我检查使用FireBug发送的报头时,请求中没有会话cookie。
我做错了什么?
当前回答
加上我的设想和解决方案,说不定能帮助到别人。我在使用RESTful api时遇到过类似的情况。我的承载HTML/Script/CSS文件的Web服务器和公开api的Application server托管在同一个域中。 然而,道路是不同的。
Web服务器- mydomain/webpages/abc.html
使用abc.js将cookie设置为mycookie
应用服务器- mydomain/webapis/servicename。
对哪个API调用
我期待在我的域名/webapis/servicename的cookie,并尝试读取它,但它没有被发送。 在阅读评论从答案,我检查在浏览器的开发工具 Mycookie的路径被设置为“/webpages”,因此在服务调用中不可用
mydomain webapis / xml数据
所以当设置cookie从jquery,这是我所做的-
$.cookie("mycookie","mayvalue",{**path:'/'**});
其他回答
在尝试了其他解决方案后,仍然没有奏效,我发现了我的问题所在。我把contentType从“application/json”改为“text/plain”。
$.ajax(fullUrl, {
type: "GET",
contentType: "text/plain",
xhrFields: {
withCredentials: true
},
crossDomain: true
});
加上我的设想和解决方案,说不定能帮助到别人。我在使用RESTful api时遇到过类似的情况。我的承载HTML/Script/CSS文件的Web服务器和公开api的Application server托管在同一个域中。 然而,道路是不同的。
Web服务器- mydomain/webpages/abc.html
使用abc.js将cookie设置为mycookie
应用服务器- mydomain/webapis/servicename。
对哪个API调用
我期待在我的域名/webapis/servicename的cookie,并尝试读取它,但它没有被发送。 在阅读评论从答案,我检查在浏览器的开发工具 Mycookie的路径被设置为“/webpages”,因此在服务调用中不可用
mydomain webapis / xml数据
所以当设置cookie从jquery,这是我所做的-
$.cookie("mycookie","mayvalue",{**path:'/'**});
AJAX调用仅在您调用的url与调用脚本在同一域中时发送cookie。
这可能是一个跨域问题。
也许你试图从www.domain-a.com调用一个url,而你的调用脚本在www.domain-b.com上(换句话说:你进行了跨域调用,在这种情况下浏览器不会发送任何cookie来保护你的隐私)。
在这种情况下,你的选择是:
Write a small proxy which resides on domain-b and forwards your requests to domain-a. Your browser will allow you to call the proxy because it's on the same server as the calling script.This proxy then can be configured by you to accept a cookie name and value parameter which it can send to domain-a. But for this to work you need to know the cookie's name and value your server on domain-a wants for authentication. If you're fetching JSON objects try to use a JSONP request instead. jQuery supports these. But you need to alter your service on domain-a so that it returns valid JSONP responds.
如果这能帮到你就好了。
只是我的2美分设置PHPSESSID cookie问题时,在本地主机和开发环境下。我对本地主机上的REST API端点进行AJAX调用。说它的地址是mysite。Localhost /api/member/login/(我的开发环境中的虚拟主机)。
当我在Postman上执行此请求时,一切正常,PHPSESSID与响应一起设置。 当我通过AJAX从Browsersync代理页面请求这个端点时(例如,从122.133.1.110:3000/test/api/login.php在我的浏览器地址行,看到域是不同的vs myste .localhost) PHPSESSID不会出现在cookie中。 当我直接从同一域的页面(即mysite.localhost/test/api/login.php)发出这个请求时,PHPSESSID设置得很好。
所以这是一个跨源源请求cookie问题,正如上面@flu回答中提到的那样
我在跨域场景下操作。在登录期间,远程服务器返回set - cookie报头,并将Access-Control-Allow-Credentials设置为true。
下一次对远程服务器的ajax调用应该使用这个cookie。
CORS的Access-Control-Allow-Credentials允许跨域日志记录。查看https://developer.mozilla.org/En/HTTP_access_control获取示例。
对我来说,这似乎是JQuery的一个bug(或者至少是下一个版本的新特性)。
更新:
cookie不会从AJAX响应中自动设置(引用: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
}
});
服务器正确地响应这个请求也很重要。这里复制来自@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