在通过$.ajax()登录到一个网站后,我试图向该网站发送第二个$.ajax()请求-但当我检查使用FireBug发送的报头时,请求中没有会话cookie。
我做错了什么?
在通过$.ajax()登录到一个网站后,我试图向该网站发送第二个$.ajax()请求-但当我检查使用FireBug发送的报头时,请求中没有会话cookie。
我做错了什么?
当前回答
There are already a lot of good responses to this question, but I thought it may be helpful to clarify the case where you would expect the session cookie to be sent because the cookie domain matches, but it is not getting sent because the AJAX request is being made to a different subdomain. In this case, I have a cookie that is assigned to the *.mydomain.com domain, and I am wanting it to be included in an AJAX request to different.mydomain.com". By default, the cookie does not get sent. You do not need to disable HTTPONLY on the session cookie to resolve this issue. You only need to do what wombling suggested (https://stackoverflow.com/a/23660618/545223) and do the following.
1)在ajax请求中添加以下内容。
xhrFields: { withCredentials:true }
2)在不同子域的资源的响应头中添加以下内容。
Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true
其他回答
把这个放在你的init函数中:
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
});
它会起作用的。
也许不能100%回答这个问题,但我无意中发现了这个帖子,希望解决一个会话问题,当ajax从innovastudio编辑器的资产管理器上传文件时。 最终解决方案很简单:他们有一个flash上传器。禁用(设置
var flashUpload = false;
在asset.php中),灯又开始闪烁。
由于这些问题很难调试,我发现在上传处理程序中放入以下内容将使你(在这种情况下是我)走上正确的轨道:
$sn=session_name();
error_log("session_name: $sn ");
if(isset($_GET[$sn])) error_log("session as GET param");
if(isset($_POST[$sn])) error_log("session as POST param");
if(isset($_COOKIE[$sn])) error_log("session as Cookie");
if(isset($PHPSESSID)) error_log("session as Global");
仔细查看日志,我很快发现了丢失的会话,其中没有发送cookie。
在尝试了其他解决方案后,仍然没有奏效,我发现了我的问题所在。我把contentType从“application/json”改为“text/plain”。
$.ajax(fullUrl, {
type: "GET",
contentType: "text/plain",
xhrFields: {
withCredentials: true
},
crossDomain: true
});
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.
如果这能帮到你就好了。
我在跨域场景下操作。在登录期间,远程服务器返回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