这个题目可能有点大了,这里主要讨论一种解决safari浏览器阻止第三方cookie问题。
 
    场景
 
    公司存在多个域名(a.com,b.com,co.com)这些域名应该统一帐号状态,a.com为公司主域名,其中帐号系统为passport.a.com,b.com现在做一个活动,需要用户进行登录,那么就跳转到passport.a.com进行登录,登录完成完根据参数会跳至活动页面。由于passport.a.com使用的jsonp的形式对a.com,b.com和c.com就行设置登录状态操作(在(如何创建帐号统一服务)中有详细说明),其他浏览器(chrome、ff、IE等)在默认浏览器配置下都没有问题,只有在safari下存在这个问题,原因在于:safari隐私设置,默认阻止第三方cookie设置,但是只要你访问过一次(这里的访问必须是用户手动操作,不能通过JS进行跳转操作)它就允许了。如果是这种情况,那么登录成功跳转回去,用户在b.com或c.com仍然没有登录状态?
 
    尝试解决方案
 
    1. 将页面放在自己服务器下面
 
    也就是说,将passprot.a.com的登录页面在b.com下自己在实现一次,这样可以保证b.com有登录状态,但是存在一下几点问题:
  • 实现成本问题,将登录这么复杂的逻辑需要自己实现并维护,不利于构建统一的帐号服务体系,增加维护成本
  • 只完成了登陆b.com,并不能登录a.com和c.com,没有完成帐号状态的同步
  • 如果登录出现验证码而验证码又不是b.com提供的服务,同样会出现cookie无法校验的问题
 
    2. 代替用户访问一次需要的域名
 
  • 通过前端事件访问,可以模拟用户点击或者直接location跳转,经过测试发现这种方案不靠谱
  • 通过服务端跳转,b.com访问一个jump.a.com专门做跳转处理,可以再到b.com这样的话就能操作a.com的cookie,但是在登录场景还是没有办法使用,原因可以参考上面的解释
 
    3. 服务端302跳转的形式
 
    既然第三方不能操作,那就使用自己的子域就行操作就行了。首先保证自己的东西都放在自己的域名下处理,如果必须要引入第三方的接口时,可以考虑将之前的jsonp请求,转化为302跳转的方式实现。这种形式也有问题,safari浏览器最大的跳转次数是15次,超过15次浏览器就会无法解析。各浏览器302次数限制可以查看浏览器重定向(302)次数限制问题
 
    确定方案
 
    以上几种方案,可以根据自己业务的实际情况选择合适的方式。
 
    针对本文最初提到的场景,我们的解决方案是使用,服务端302跳转代替jsonp请求的方式完成的。整个实现的流程大致如下:
 
    
 
    这样就完成了所有域名登录状态的设置,准确来说是所传域名列表会被设置上登录状态。
 
    总结
 
    这里是以登录为例,解决safari浏览器默认阻止第三方cookie问题的,在其他场景下看情况使用不同的方案,当然在这里也是抛砖引玉,希望能得到更好,更方便的实现方式。再说点儿题外话,讨论这个方案用了不少时间,有很多方案很简单但是我们不能使用是考虑到我们的实现成本问题,已经对用户的影响,这种情况下,尽可能少的让用户来操作什么完成你本身就应该完成的事情。总之一个原则,能不让用户做的尽量别让用户做,用户的认知成本和学习成本你都是无法评估的。
 
 
 

safari浏览器cookie问题的更多相关文章

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

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

  2. 苹果safari浏览器登陆时Cookie无法保存的问题

    Safari浏览器不支持将非ASCII字符存入Cookie,所以中文在保存的时候就会出问题,分号(";")也不能存在Cookie中,所以需要通过方法去除内容中的分号,在Cookie ...

  3. 关于苹果safari浏览器登陆时Cookie无法保存的问题

    前段时间,修改了登录处理后给到客户端浏览器Cookie的内容,新增了一个姓名的value,发现safari不能保存该Cookie的内容,同时Chrome.firefox.ie等浏览器都能正常的访问,直 ...

  4. Safari浏览器Session问题

    Safari浏览器中经常出现session无法写入或同一个会话中Session ID常变动的事情.尤其以iOS7版本居多. 问题本身并不难猜,应该就是cookie无法写入引起的.奇怪的是,部分同版本的 ...

  5. 各浏览器Cookie大小、个数限制

    一.浏览器允许每个域名所包含的cookie数: Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie. Firef ...

  6. Google Chrome谷歌/火狐/Safari浏览器开发者工具基本使用教程

    前言 在阅读下面内容之前,那么些简单的了解浏览器开发者工具到底是什么东西,到底有什么用途. 浏览器开发者工具到底是什么? 其实简单的说,浏览器开发者工具就是给专业的web应用和网站开发人员使用的工具, ...

  7. 各浏览器Cookie大小、个数限制【转】

    先插入一条广告,博主新开了一家淘宝店,经营自己纯手工做的发饰,新店开业,只为信誉!需要的亲们可以光顾一下!谢谢大家的支持!店名: 小鱼尼莫手工饰品店经营: 发饰.头花.发夹.耳环等(手工制作)网店: ...

  8. 苹果微信内置浏览器cookie

    苹果微信内置浏览器cookie会被自动清掉,但safari不会清除,原因还未找到,解决方法是把前端把数据通过header传到后台

  9. 不同浏览器Cookie大小

    一.浏览器允许每个域名所包含的 cookie 数:Microsoft 指出 Internet Explorer 8 增加 cookie 限制为每个域名 50 个,但 IE7 似乎也允许每个域名 50 ...

随机推荐

  1. Apache+php配置 Mysql安装出错解决办法

    此文包括的注意内容:软件版本及下载地址Apache2.4的配置和安装php7.0的配置mysql5.5的安装常见问题及解决方法1.软件版本Windows server 2008 r2+ 64位Apac ...

  2. Java 常调用的Webservice接口的方法

    WebService是基于Web的服务,WebService使用SOAP协议实现跨编程语言和跨操作系统平台,接收和响应外部系统的某种请求,从而实现远程调用.WebService采用HTTP协议传输数据 ...

  3. 推荐C/C++常见的面试题目

    http://blog.163.com/bingqingyujie..5/blog/static/75559361201011861958534/ 里面有详细的面试类型

  4. Laravel-数据库操作笔记

    (慕课网_轻松学会Laravel-基础篇_天秤vs永恒老师) 一.直接使用sql语句 1.路由 2.StudentController.php 二.查询构造器 简介:Laravel查询构造器(quer ...

  5. sql server 2008 中的架构(schame)理解

    机构是属于数据库里面的.在一个数据库中,每一张表都属于一个架构,架构就像是命名空间,把数据库中的表分成不同的组,一个组就是一个命名空间,方便管理

  6. My way on Linux - 知识梳理计划

    知识梳理计划图 近期计划把自己学习的工作中用到的Linux知识梳理下,敬请期待.

  7. 连接Oracle11g数据库时遇到无监听,网络适配器无法建立等问题的一些解决办法

    最近在用Java做一个学生成绩管理系统,打算用Oracle数据库.由于原先没接触过Oracle,所以安装完数据库后,连接数据库时遇到各种问题,网上搜索解决方案还是没有解决时,又重新安装了几次.终于在前 ...

  8. Linux下oracle 11g安装

    服务器环境要求     硬盘 20G以上 ,必须高于1G的物理内存,交换空间一般为内存的2倍,例如:1G的内存可以设置swap 分区为3G大小   在Root用户下执行以下步骤: 修改用户的SHELL ...

  9. Oracle start with connect by prior 用法

    Oracle start with connect by prior 用法    语法: select * from 表名 where 条件1 start with 条件2 connect by pr ...

  10. C#如何设置下拉COMMBOX为不可输入,只有下拉条目

    设置下拉框的DropDownStyle属性为DropDownList