facebook 客户端(应用程序)和 cookie(每个 url 创建的新 cookie,而不是每个域一个)

Posted

技术标签:

【中文标题】facebook 客户端(应用程序)和 cookie(每个 url 创建的新 cookie,而不是每个域一个)【英文标题】:facebook client (app) and cookies (new cookie created per url instead of one per domain) 【发布时间】:2015-03-23 23:02:54 【问题描述】:

我有一个网站,如果设置了 cookie,它不应该显示广告,cookie 有效期为 24 小时。在浏览器、移动浏览器等上一切正常,但如果用户从 ios 上的 Facebook 应用程序(客户端)打开我网站的 url(还不能在 android 上探测它),cookie 可以工作,但每个 url 都会生成,因此广告会在每个页面首次加载时展示。应该仅在 24 小时内每次首次加载网站时进行。

同样,这只发生在 Facebook 移动应用程序上(据我所知是 iOS)。这是我生成 cookie 的代码。

// Cookie functions

function getCookie(cname) 
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) 
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
    


function setCookie(cname, cvalue, exdays) 
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+d.toUTCString();
    document.cookie = cname + "=" + cvalue + "; " + expires + "; path=/; domain=.site.com;";


function checkCookie(cname) 
    var cookie=getCookie(cname);
    if (cookie) 
        return true;
    else
        return false;
    

那么导致这种行为的原因是什么?

【问题讨论】:

【参考方案1】:

页面是通过 Facebook App 在应用内浏览器中加载的,还是直接在 Safari/Chrome 中加载的?在点击链接时,或者在(应用内)浏览器第一次打开后的每个“第一次”请求时,您是否有这种行为?

对我来说,以下适用于 iOS Facebook 应用的应用内浏览器。第一次没有cookie。当我关闭浏览器并再次从时间线/newfeeds 中单击链接时,应用内浏览器第二次打开时,找到了 cookie。

<html>
<head>Test Cookies</head>

<script type="text/javascript">
function getCookie(cname) 
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) 
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) == 0) return c.substring(name.length,c.length);
    


function setCookie(cname, cvalue, exdays) 
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+d.toUTCString();
    document.cookie = cname + "=" + cvalue + "; " + expires + "; path=/;";


function checkCookie(cname) 
    var cookie=getCookie(cname);
    if (cookie) 
        return 'yes, cookie! ' + cookie;
    else
        return 'no cookie';
    

</script>

<body>
<script type="text/javascript">document.write(checkCookie('test')); setCookie('test', 'value', 1); </script>
</body>
</html>

【讨论】:

以上是关于facebook 客户端(应用程序)和 cookie(每个 url 创建的新 cookie,而不是每个域一个)的主要内容,如果未能解决你的问题,请参考以下文章

在用户注销时从我的应用程序中删除 facebook 会话 cookie

当我们通过 facebook 登录时如何删除 facebook cookie

Facebook 如何在画布页面上为 iFrame 设置跨域 cookie?

通过facebook登录后设置spring security记住我的cookie

如何使用 Shiro 验证基于 cookie 或 facebook 的用户?

带有 Facebook 访问令牌的 MVC 5 Web API 到 RegisterExternal,无需 Cookie