使用纯Javascript在AJAX请求中包含cookie,用于跨域请求

使用纯Javascript在AJAX请求中包含cookie,用于跨域请求,javascript,ajax,json,cross-domain,cors,Javascript,Ajax,Json,Cross Domain,Cors,我正在开发分析应用程序,我需要一种方法来唯一地识别每个用户设备。为此,我遵循的方法是从服务器端创建“cookie”。所有页面点击和跟踪都将使用Ajax请求更新到服务器 我的问题是,我在xyz.com上有我的分析。Abc.com和123.com是安装我的插件(javascript)代码的应用程序。在第一次访问时,我创建了一个cookie“sha1”来唯一地标识每个用户/设备,在每次连续请求时,我需要在服务器中检查cookie“sha1”是否存在,基于此,应该采取必要的操作。由于我正在对服务器进行A

我正在开发分析应用程序,我需要一种方法来唯一地识别每个用户设备。为此,我遵循的方法是从服务器端创建“cookie”。所有页面点击和跟踪都将使用Ajax请求更新到服务器

我的问题是,我在xyz.com上有我的分析。Abc.com和123.com是安装我的插件(javascript)代码的应用程序。在第一次访问时,我创建了一个cookie“sha1”来唯一地标识每个用户/设备,在每次连续请求时,我需要在服务器中检查cookie“sha1”是否存在,基于此,应该采取必要的操作。由于我正在对服务器进行Ajax调用,而且这是一个跨域请求,因此请求中没有添加cookie。我研究了各种选项,包括请求cookie,比如设置“withCredentials=true”、“crossDomain=true”,但没有成功


我想要使用纯Javascript的解决方案,如果有人能帮助我,我将不胜感激。此外,如果推荐任何可行且易于实施的解决方案,我愿意改变我的方法。

这不能在js中完成,您需要修改从服务器发送的标题:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:X-Requested-With, X-Prototype-Version, Content-Type, Origin, Allow
Access-Control-Allow-Methods:POST, GET, OPTIONS
Access-Control-Allow-Origin:http://yourdomain
Access-Control-Max-Age:1728000

如何添加这些标题,取决于您使用的服务页面的软件。

这不能在js中完成,您需要修改从服务器发送的标题:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:X-Requested-With, X-Prototype-Version, Content-Type, Origin, Allow
Access-Control-Allow-Methods:POST, GET, OPTIONS
Access-Control-Allow-Origin:http://yourdomain
Access-Control-Max-Age:1728000
如何添加这些标题,取决于您使用哪种软件来提供页面。

下面是一个XMLHttpRequest()示例,我已在Chrome、FF 3.5+、Safari 4+、IE10+中成功地将其用于具有cookie凭据的CORS。如果这不起作用,可能是服务器配置或浏览器兼容性有问题

// GET request
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = 'application/json';
xhr.processData = false;
xhr.contentType = false;
xhr.onload = function() {
    // Successful request
    if (xhr.status == 200) {
        success(xhr.response);
    }
};
xhr.onerror = function() {
    // Crossdomain request denied
    if (xhr.status === 0) {
        corsFailed(xhr.response);
    }
};
xhr.crossDomain = true;
xhr.withCredentials = true;
xhr.send();
我知道safari和IE10+要求用户在其浏览器首选项中允许第三方cookie。我认为,如果不使用自定义头来代替cookie,并且在服务器上设置访问控制允许头来包含自定义头,那么就没有办法解决这个问题。此外,我相信您需要访问控制允许标题:“内容类型”

要追溯到IE8/9,您需要实现对XDomainRequest()的回退,但这些不支持cookie凭据

processData和contentType标志可能仅对POST请求是必需的。在执行POST时,我使用FormData()对象,而不是JSON。

下面是一个XMLHttpRequest()示例,我在Chrome、FF 3.5+、Safari 4+、IE10+中成功地将其用于具有cookie凭据的CORS。如果这不起作用,可能是服务器配置或浏览器兼容性有问题

// GET request
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = 'application/json';
xhr.processData = false;
xhr.contentType = false;
xhr.onload = function() {
    // Successful request
    if (xhr.status == 200) {
        success(xhr.response);
    }
};
xhr.onerror = function() {
    // Crossdomain request denied
    if (xhr.status === 0) {
        corsFailed(xhr.response);
    }
};
xhr.crossDomain = true;
xhr.withCredentials = true;
xhr.send();
我知道safari和IE10+要求用户在其浏览器首选项中允许第三方cookie。我认为,如果不使用自定义头来代替cookie,并且在服务器上设置访问控制允许头来包含自定义头,那么就没有办法解决这个问题。此外,我相信您需要访问控制允许标题:“内容类型”

要追溯到IE8/9,您需要实现对XDomainRequest()的回退,但这些不支持cookie凭据


processData和contentType标志可能仅对POST请求是必需的。我在发布文章时使用FormData()对象,而不是JSON。

我确实在服务器中包含它们,但我没有发现将cookie添加到AJAX请求中。您是否验证了标题是否按需要提供?是,我对它们进行了验证,并确实在响应中找到了相应的标题访问控制允许凭据:真实访问控制允许来源:内容长度:0日期:2014年3月20日星期四14:22:40 GMT服务器:Apache Coyote/1.1 Set Cookie:sha1=kCalLTmJqNIz67uS;Expires=Sat,2014年4月19日14:22:40 GMTI确实将它们包含在服务器中,但我没有发现将cookie添加到AJAX请求中。您是否验证了标头是否按需要提供?是,我对它们进行了验证,并确实在响应中找到了相应的标题访问控制允许凭据:真实访问控制允许来源:内容长度:0日期:2014年3月20日星期四14:22:40 GMT服务器:Apache Coyote/1.1 Set Cookie:sha1=kCalLTmJqNIz67uS;Expires=2014年4月19日星期六14:22:40 GMT