前段时间在项目里遇到了一个比较头疼的问题,就是高版本的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

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

  1. 在Chrome、Firefox等高版本浏览器中实现低延迟播放海康、大华RTSP

    一.背景 现在到处是摄像头的时代,随着带宽的不断提速和智能手机的普及催生出火热的网络直播行业,新冠病毒的大流行又使网络视频会议系统成为商务会议的必然选择,因此RTSP实时视频流播放及处理不再局限于安防 ...

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

    前一阵子,我们发现高版本的Safari中默认会阻止第三方cookie,如下图所示. 问题 什么是第三方cookie呢?在访问一个网站A时,网站A算作第一方,如果网站A中引用了另一个网站X(网站X的域名 ...

  3. 改变浏览器中默认的ctrl+s方法

    在一般的情况下,我们在浏览网页的时候按下ctrl+s,浏览器会弹出一个保存网页的框. 但是在一些特定的网页中,我们希望ctrl+s不是弹出默认的保存窗口,而是进行一下别的操作. 比如在我们使用简书的时 ...

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

    完美解决safari.微信浏览器下拉回弹效果,只保留局部回弹效果. CSS代码 .box{ overflow: auto; -webkit-overflow-scrolling: touch; } H ...

  5. 解决:高版本jdk编译低版本代码时eclipse提示Access restriction:The type 'Unsafe' is not accessible due to restriction on required library

    在Eclipse中采用高版本jdk编译一些低版本的源码时,由于源码中使用了一些高版本中过时的API,可能就会报错,类似于: Access restriction:The type 'Unsafe' i ...

  6. 解决Mybatis-plus高版本不向后兼容的问题

    mybatis-plus插件后面的版本没有兼容低版本.即:不存在低版本中EntityWrapper这个类了.而该类采用数据库表真实字段名作查询条件,这样硬编码形式确实不友好,比如如果后面数据库表中字段 ...

  7. oracle解决导入高版本dmp报错问题:IMP-00058: ORACLE error 12547 encountered

    低版本oracle导入高版本的dmp时,导过的人都应该清楚,直接导入是会报错的,报错信息如下,其实解决这个问题很简单, 只要修改一下dmp内的版本号就可以了. 修改版本不能随便使用文本工具打开,否知会 ...

  8. 解决eclipse高版本JDK编译的项目到低版本JDK服务器上不能运行的问题

    错误提示信息:Unsupported major.minor version 52.0,意思是说,当前jdk的版本不支持更高版本jdk编译出来的class文件. 我的编译环境,eclipse使用的是j ...

  9. 【bug解决】ios微信浏览器中背景音乐无法播放

    我记得之前在一次项目中,出现过浏览报错: 当时的文档链接如右:[解决]HTML5新标签audio的autoplay自动播放属性失效的解决方案 所以在这次H5的制作中,我使用了iframe来加载音频文件 ...

随机推荐

  1. XML Schema choice 元素

    XSD : <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://w ...

  2. github初体验

    1.服务端 首先得有一个github账号 用户名和密码 2.客户端 github是服务端,要想在自己电脑上使用git我们还需要一个git客户端,我这里选用msysgit,这个只是提供了git的核心功能 ...

  3. windows+caffe(六)——convert.bat

    convert.bat的格式为 convert_imageset.exe的位置+空格+FLAGS+空格+图片所在的位置+空格+你生成的list的位置+空格+将要生成的db格式要保存的位置 建议都使用绝 ...

  4. vs2010取消显示所有文件 崩溃

    这属于vs2010的bug,以下是微软官方对些问题的回应: i am still investigating the problem, but looks like the issue is caus ...

  5. linux文件基本属性

    在Linux中第一个字符代表这个文件是目录.文件或链接文件等等. 当为[ d ]则是目录 当为[ - ]则是文件: 若是[ l ]则表示为链接文档(link file): 若是[ b ]则表示为装置文 ...

  6. asp.net 微信开发失效汇总

    1.验证控件 在Iphone 5以上版本不兼容(改为js验证)

  7. this的问题

    javascript this可以绑定到:全局对象,自己定义的对象,用构造函数生成的对象,通过call或者apply更改绑定的对象    1.全局对象  1 2 3 4 5 function glob ...

  8. js计算两个日期的差值

    // 获取两个比较值的毫秒数var postman_confirmtime_ms = Date.parse(new Date(data.postman_confirmtime.replace(/-/g ...

  9. 2016 icpc-ec-final

    一不小心惨变旅游队,不过上海的风景不错 顺带找其他队交流一下集训经验...或许可以成为选拔和集训16级的依据 A.直接模3就可以了,2^(3*n)%7=1 L.每场比赛3种情况,穷举就可以了 D.刚开 ...

  10. selenium定位元素(本内容从https://my.oschina.net/flashsword/blog/147334处转载)

    注明:本内容从https://my.oschina.net/flashsword/blog/147334处转载. 在使用selenium webdriver进行元素定位时,通常使用findElemen ...