本地存储跨域 - Safari默认禁用它

时间:2016-07-26 08:03:52

标签: javascript html5 safari cross-domain local-storage

问题

我使用了Ofir Dagan的github项目:存储跨域本地存储。

它实现了html5本地存储: https://github.com/ofirdagan/cross-domain-local-storage

问题

Safari默认情况下不允许第三方cookie(其他浏览器允许)。

Safari隐私首选项包括:

enter image description here

默认设置为:“允许我访问的网站”。

我读到了这些设置:

  1. 始终阻止 - 阻止所有第一方Cookie并阻止所有第三方Cookie。

  2. 仅允许来自当前网站 - 允许所有第一方Cookie并阻止所有第三方Cookie。

  3. 允许我访问的网站 - 允许所有第一方Cookie并阻止所有第三方Cookie,除非该第三方同时是第一方(基于当前的Cookie和浏览)历史)。

  4. 始终允许 - 允许所有第一方Cookie并允许所有第三方Cookie。

  5. 解决方案我尝试过

    使用iframe(像素)的本地存储 - 我认为它已不再适用于Safari - Is there any workaround to set third party cookie in Iframe for safari?

    我认为有一种方法可以在Safari上的第一方和第三方网站之间共享本地存储。 (Facebook.com和Booking.com共享不同域之间的数据)。

    我成功地通过移除API并自己编写来实现它,但我不想删除API并自己实现(希望有一个小修复以支持Safari) :

    Iframe.html

    window.addEventListener('cors_event', function(event) {
        if(event.event_id === 'my_cors_message'){
            if (event.data.options.funcName == "SetItem") {
                localStorage.setItem(event.data.options.key, event.data.options.value);
            }
            else if (event.data.options.funcName == "GetItem") {
                return localStorage.getItem(event.data.options.key);
            }
        }
    });
    

    MainPage:

    <iframe id="target" src="iframe.html" frameborder="1"></iframe>
    
    <script>
    
        var target = document .getElementById('target');
        target.onload = function(){
            target.contentWindow.postMessage('set', '*')
        }
    </script>
    

    有人知道如何通过更改某些API逻辑来支持Safari来实现它吗?

    任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:8)

正如Cross-Storage library documentation所述:

  

有关Safari 7+(OSX,iOS)的说明

     

默认情况下,Safari 7+禁用所有跨域本地存储访问。这是&#34;阻止cookie和其他网站数据的结果&#34;隐私设置被设置为&#34;来自第三方和广告商&#34;。任何跨存储客户端代码都不会崩溃,但是,它只能访问沙盒隔离的本地存储实例。因此,以前由其他来源设置的数据都不可访问。如果是一个选项,可以回退到使用这些用户代理的根cookie,或者从服务器端存储请求数据。

答案 1 :(得分:6)

您可以尝试Store.JS。根据文档:

  

store.js公开了一个用于跨浏览器本地存储的简单API