iOS cookie设置问题:safari和chrome

时间:2017-07-10 21:56:18

标签: javascript ios google-chrome cookies mobile-safari

我正在调试一个Cookie设置问题,该问题仅在iOS上的Chrome和Safari中重现。看看以下代码块在OSX上的Chrome / Safari / Firefox上运行正常:

if (navigator.userAgent.indexOf('iPad') > -1) {
    window.onpagehide = placeCookie
} else {
    window.onbeforeunload = placeCookie
}

function placeCookie () {
    if (isAuthenticated()) {

        var cookie = 'cookieName=' + token + '; max-age=60'

        if (env === 'prod') {
            cookie += '; secure'
        }

        document.cookie = cookie
    }
}

此代码用于在窗口检测到导航时放置cookie。在我们的例子中,因为它是angularjs,我们正在监听页面重新加载,我们希望该cookie与请求一起使用。

重新加载代码:window.location.reload(true)

开发我正在使用Charles Proxy来嗅探cookie,并检查节点服务器上的cookie,因为safari检查器在页面重新加载时关闭。当我重新打开检查器窗口时,我可以看到cookie已在浏览器中设置,但服务器或Charles都没有看到cookie。这是来自iPad上的safari检查器的cookie的粘贴(server / charlesproxy看不到):

Name        Value   Domain                      Path Expires 
cookieName  token   localhost.charlesproxy.com  /    7/10/2017, 11:23:13 PM 39

当我在其他浏览器上浏览时,cookie随处可见。

有谁知道iOS不承认cookie的任何原因?是否有可能在放置cookie之前在iOS上发出请求?

如果我能提供更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

我们使用

function setCookie(name, value, days = 7, path = '/') {
            const expires = new Date(Date.now() + days * 864e5).toUTCString()
            document.cookie = name + '=' + encodeURIComponent(value) + '; expires=' + expires + '; path=' + path
        }

setCookie('cookieName', accessToken, 1);

可以在所有设备/浏览器上运行(据我所知-并非每个组合都经过测试,但肯定在装有Chrome / Safari的iPhone / Mac和装有Chrome的PC上)。

它与您显示的代码(用于基本的cookie创建)没有显着差异,并且可能仍然无法满足您的使用需求,但值得一试。...

这是getCookie的一面(我没有写这段代码-在某个地方捡起它-很可能是这样!-我只知道它很好用!:)

function getCookie(c_name) {
            if (document.cookie.length > 0) {
                c_start = document.cookie.indexOf(c_name + "=");
                if (c_start !== -1) {
                    c_start = c_start + c_name.length + 1;
                    c_end = document.cookie.indexOf(";", c_start);
                    if (c_end === -1) {
                        c_end = document.cookie.length;
                    }
                    return unescape(document.cookie.substring(c_start, c_end));
                }
            }
            return "";
        }