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

    VC6.0中Release下调试模式设置 http://blog.csdn.net/wangqinghao/article/details/7730428

  2. C#:额外知识点

    6.写入.输出二进制数据(指定地址 与 内存交互数据) public void WriteSerialize(object data, int offset, int length) { Binary ...

  3. 【转载】Windows下VSCode编译调试c/c++

    懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Windows下VSCode便携式c/c++环境 http://blog.csdn.net/c_duoduo/article/de ...

  4. 关于xmpp协议发送消息,登录认证SSL报错的问题

    Q:错误描述如下 Traceback(most recent call last): File"/tails-share/features/scripts/otr-bot.py", ...

  5. 建立docker私有库(docker registry)(转)

    建立docker私有库(docker registry) 博客分类: docker   我的目标还是无互联网安装,部署内部的docker私有库,目前docker镜像的获得还是需要互联网,将下载好的do ...

  6. 关于C语言宏定义 使用do{ xxxx }while()

    暂时感觉像是由于":"的原因,关于使用习惯方面的问题!! 下面是copy的: 这样的宏见过么: Cpp代码 #define FOO(x) do {\ some_code_line_ ...

  7. StringBuffer(线程安全)StringBuilder(非线程安全)

    StringBuffer属于线程安全,相对为重量级 StringBuilder属于非线程安全,相对为轻量级 线程安全的概念: 网络编程中许多线程可能会同时运行一段代码.当每次运行结果和单独线程运行的结 ...

  8. SQL-Server使用点滴(一)

    前言 SQL的语法比较简单,学起来相比界面UI控制要简单得多,但是SQL在企业级应用中又是如此的重要,以至于很多开发人员都把重点放在SQL上. SQL并没有面向对象的概念,最复杂的设计也不过是表值函数 ...

  9. [Python]简易terminal歌词滚动播放器

    整合了网易云的一些API,想写一个terminal版的音乐播放器,但是还没有想好写成什么样子. 暂时写了一个必须又的功能:带歌词滚动的播放器,用了pygame里的mixer来播放音乐. 准备有时间的时 ...

  10. Arduino 极速入门系列 - 光控灯(3) - 光敏电阻、与电阻分压那些事

    继续是讲解基础原理,新手专用部分.这次讲光敏电阻,和用电阻分压.光电元器件有好几种,其中测光相关的元器件,常见的有光敏三极管和光敏电阻,我们这次光控灯用光敏电阻.在我们光控灯里面,将会使用它搭建出分压 ...