解决Safari高版本浏览器中默认禁用第三方COOKIE(含demo)

前段时间在项目里遇到了一个比较头疼的问题,就是高版本的Safari中默认会阻止第三方cookie,这使得使用Safari浏览器的用户无法按照正常的业务逻辑进行操作。

问题展现

知识点

什么是第三方cookie呢?在访问一个网站A时,网站A算作第一方,如果网站A中引用了另一个网站B(网站B的域名与网站A的域名不同)的资源,这时这个网站B就被认为是第三方。需要注意的是,这儿区分不同网站的标准是域名是否相同,而不是这两个网站是否由同一个公司运营。比如,taobao.com和tmall.com被认为是两个网站,尽管它们都属于阿里集团。

问题demo

仅供参考,新建两个basic MVC项目CookieSolution和TestCookieSolution。假设CookieSolution里面是正常的业务逻辑,有两个页面Page1 和Page2 ,相应代码如下:

        public ActionResult Page1()
        {
            Session["mySession"] = "Jackbase";
            return View();
        }

        public ActionResult Page2()
        {
            if (Session["mySession"] != "Jackbase")
            {
                return Redirect("Page1");
            }
            return View();
        }    

后台代码如上,前台代码如下:

@*Page1的前台代码*@
<h2>Page 1</h2>

<a href="/Home/Page2">Go to Page 2</a>

@*Page2的前台代码*@
<h2>Page 2</h2>

<a href="/Home/Page1">Back to Page 1</a>

可以看出在Page1的初始化里设置Session["mySession"]的值,在Page2的初始化里检测Session["mySession"]的值,如果值不对,则跳回Page1。在TestCookieSolution中的页面里用iframe引用CookieSolution的页面,前台代码如下:

<h2>Test</h2>

<iframe src="http://www.cookieSolution.com"></iframe>

后台

     public ActionResult Test()
        {
            return View();
        }

不要问我www.cookieSolution.com是什么,自行在hosts里添加。

127.0.0.1    www.cookieSolution.com

一切准备就绪,在IIS里面新建两个站点,分别绑定CookieSolution(80端口)和TestCookieSolution(8050端口)

访问http://localhost:8050进行测试(基于Safari浏览器),发现点击Go to Page2完全不能跳到Page2中,依然在Page1 中。Safari安全机制阻止了第三方的Cookie以及Session,网上有很多方法我都做了一一尝试,什么P3P几乎完全不行...

解决方案

既然浏览器阻止的是第三方Cookie及数据,那么我们就想办法让浏览器认为iframe中的页面不属于第三方不就行了吗?那么我们在进入Test页面之前先打开www.cookieSolution.com中的一个页面,设置cookie,然后再跳转到Test页面,这时www.cookieSolution.com就不在属于第三方了。

在TestCookieSolution新增一个页面,PreTest.

        public ActionResult PreTest()
        {
            return View();
        }
<h2>PreTest</h2>

<a href="http://www.cookieSolution.com/Home/CookieMaker?url=http://localhost:8050/Home/Test">Go to Test</a>

在CookieSolution的HomeController里面新增方法

        public ActionResult CookieMaker()
        {
            // 随意设置一个Session
            Session["Prepare"] = "jb";
            return Redirect(Request.QueryString["url"]);
        }

这样就解决了这个难题了,有兴趣的同学可自行测试,这里就不过多演示了。

参考资料

Missing cookies on iframe in safari 5.1.5

Safari 3rd party cookie iframe trick no longer working?

Ipad Safari iframe cookie 当浏览器默认禁用第三方COOKIE

本文所用代码demo

CookieSolution.zip

时间: 2024-08-09 19:06:49

解决Safari高版本浏览器中默认禁用第三方COOKIE(含demo)的相关文章

使用fixed制作浮动广告(注意:解决闪屏问题,但适用于高版本浏览器,低版本的浏览器不适用)

<script language="javascript" type="text/javascript"> //隐藏广告 function closeDiv(){ document.getElementById("floatDiv").style.display="none"; } </script> <body> <!--position:fixed能够使得广告div实现滚动效果,但

Safari只是众多浏览器中的一个比较强大的罢了。

毕竟再高端也是个浏览器,从开始上网就要一直使用浏览器,Safari只是众多浏览器中的一个比较强大的罢了.      下面给大家介绍一下Safari的一个碉堡隐藏功能!!!!(其实不算隐藏啦...在菜单栏里就有,只是好多人不知道而已)      这个功能就是:截取网页,并作为widgets放入一.Action配置中的各项默认值       /WEB-INF/page/hello.jsp            1>如果没有为action指定class,默认是ActionSupport.2>如果没有

完美解决safari、微信浏览器下拉回弹效果。

完美解决safari.微信浏览器下拉回弹效果,只保留局部回弹效果. CSS代码 .box{ overflow: auto; -webkit-overflow-scrolling: touch; } HTML代码 <body class="box"> <div class="scroll" style="height:1500px"> </div> </body> JS代码 var overscrol

PHPExcel在高版本PHP7中,Writer-&gt;save出现ERR_INVALID_RESPONSE错误的解决方法

这个Writer->save错误可能由于很多原因导致,其中有一部分是因为header和缓冲区的错误导致的 这部分具体讨论可以看这里http://stackoverflow.com/questions/8566196/phpexcel-to-download 然而还有一个不容易发现的问题,在高版本PHP7下,出现ERR_INVALID_RESPONSE的错误还可能由于下面的原因导致 1 Fatal error: 'break' not in the 'loop' or 'switch' conte

高版本浏览器的自定义 事件

/* https://blog.csdn.net/magic__man/article/details/51831227 */ document.addEventListener('上滚',function(ev){ console.log(ev); // alert('正在山gun'); }); //创建event的对象实例. var event = document.createEvent('HTMLEvents'); // 3个参数:事件类型,是否冒泡,是否阻止浏览器的默认行为 event

Asp.net_解决在高版本ie浏览器下按钮点击事件不触发

这是微软的一个兼容bug,通过服务器补丁方式解决. 没有此修补程序时出现的常见问题 请考虑下面的方案: 您可以使用 Windows Internet Explorer 10 来访问基于 ASP.NET 网页. 该网页启动回发. 在此方案中,回发发生故障,并且您会收到以下错误消息: 脚本遇到错误","'__doPostBack' 未定义 补丁下载: .NET 4 - http://support.microsoft.com/kb/2600088 .NET 2.0&3.5 - ht

html5shiv:用于解决IE9以下版本浏览器对HTML5新增标签不识别,并导致CSS不起作用的问题

由于IE6/IE7/IE8还有很大一部分用户,为了让网站浏览者都能正常的访问HTML5网站,解决方案就有下面两个: 1. 为网站创建多套模板,通过程序对User-Agent的判断给不同的浏览器用户显示不同的页面,这样的维护成本比较高,也失去响应式设计的意义. 2. 使用Javascript来使不支持HTML5的浏览器支持HTML标签.目前大多网站采用的这种方式(Bootcss官方例子也是如此). 原理:利用脚本document.createElement("")创建对应的脚本,CSS选

在高版本SDK中打开现存低版本SDK工程

直接打开低版本SDK工程会出现错误提示:“Unable to resolve target 'android-xx” 解决方法: 1.将project.properties文件中的“target=android-xx”更改为当前API所对应的版本 2.注意AndroidManifest.xml文件中“android:minSdkVersion="xx"”应该小于等于引入工程的API版本 注意:若更改后重新编译仍然报错,请删除gen目录下R.java与buildconfig.java文件

解决eclipse项目在浏览器中启动时老是报404错误可是路径没错

首先在服务器上启动,即点击下面圈住位置,再到浏览器上运行 成功