JS CORS:是否允许设置cookie值= cors请求的响应?

时间:2017-05-24 03:51:02

标签: javascript cookies cors

我有两个域名:domain1.com,domain2.com。当用户打开domain1 js脚本时,cors请求domain2.com并返回简单的字符串响应。当js脚本收到响应时,它会设置cookie COOKIE_NAME =响应文本。当我分析domain1的访问日志时,我只有40%的会话cookie COOKIE_NAME设置了。

为什么cookie没有设置在60%的会话中?

此代码不支持IE,因为IE用户占我们用户的1%。 代码:

var DONE =  (typeof XMLHttpRequest.DONE !== 'undefined') ? XMLHttpRequest.DONE : 4;

document.addEventListener('DOMContentLoaded', updateCookie);

function updateCookie() {
    var value = getCookie(COOKIE_NAME);

    if (typeof value !== 'undefined') {
        return;
    }

    var xhr = new XMLHttpRequest();
    try {
        xhr.open('GET', DOMAIN2, true);
        xhr.withCredentials = true;

        xhr.onreadystatechange = function () {
            if (xhr.readyState !== DONE) {
                return;
            }

            if (xhr.status === 200) {
                var value = xhr.responseText;
                setCookie(COOKIE_NAME, value, COOKIE_LIFE_TIME);
            } 
        };

        xhr.send();
}

function getCookie(name) {
        var matches = document.cookie.match(new RegExp(
            "(?:^|; )" + name.replace(/([.$?*|{}()\[\]\\\/+^])/g, '\\$1') + "=([^;]*)"
        ));
        return matches ? decodeURIComponent(matches[1]) : undefined;
}

function setCookie(name, value, expires) {
        if (typeof expires === "number" && expires) {
            var date = new Date();
            date.setTime(date.getTime() + expires * 1000);
            expires = date;
        }

        if (expires && expires.toUTCString) {
            expires = expires.toUTCString();
        }

        value = encodeURIComponent(value);

        var updatedCookie = name + "=" + value;

        updatedCookie += "; path=/; " + "expires=" + expires;

        document.cookie = updatedCookie;
}

1 个答案:

答案 0 :(得分:0)

经过研究,我得知有几个原因导致问题:

  • 在访问日志中计算唯一Cookie的不正确过程。需要清除访问日志中的'thrash'日志条目,例如API请求,静态资源请求等。
  • 拥有广告拦截器的用户(约占所有用户的15%)。因为请求的域位于阻止列表中
  • 禁用了3d派对Cookie的用户
  • 机器人
  • 使用IE的用户