使用Pure Javascript在包含跨域请求的AJAX请求中包含Cookie

时间:2014-03-20 13:51:17

标签: javascript ajax json cross-domain cors

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

我的问题是,我在xyz.com上有我的分析。 Abc.com和123.com是安装我的插件(javascript)代码的应用程序。在第一次访问时,我正在创建一个cookie" sha1"为了唯一地识别每个用户/设备,在每个连续的请求中,我需要在服务器中检查cookie" sha1"存在,基于此应该采取必要的行动。由于我正在向服务器发出Ajax调用,并且由于它是跨域请求,因此请求中不会添加任何cookie。我已经查看了各种可用的选项,包括请求像设置" withCredentials = true"," crossDomain = true",但没有成功。

我想要使用Pure Javascript的解决方案,如果有人帮助我,我将非常感激。如果建议采用任何可行且易于实施的解决方案,我也愿意改变我的方法。

2 个答案:

答案 0 :(得分:4)

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

// 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,并在服务器上设置Access-Control-Allow-Headers以包含自定义标头。另外我相信你需要Access-Control-Allow-Headers:" Content-Type"。

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

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

答案 1 :(得分:0)

无法在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

如何添加这些标题,取决于您使用哪种软件来提供页面。