这个题目可能有点大了,这里主要讨论一种解决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. MergeSort 归并排序

    实现: 二路归并 public class TestMergeSort { public int[] mergeSortArray(int[] arr, int left, int right){ i ...

  2. c语言函数定义、函数声明、函数调用以及extern跨文件的变量引用

    1.如果没有定义,只有声明和调用:编译时会报连接错误.undefined reference to `func_in_a'2.如果没有声明,只有定义和调用:编译时一般会报警告,极少数情况下不会报警告. ...

  3. 原生sql语句执行

    public function Text() { $nation = D("Nation"); $sqla = "select * from nation"; ...

  4. jsp filter登录限制过滤器

    http://www.cnblogs.com/hemingwang0902/archive/2012/01/09/2316956.html UserFilter.java package filter ...

  5. Unity 触屏缩放模型

    现在的手机都是触屏控制的,那么在游戏中我们想通过手指在屏幕上滑动捕获相应的动作呢?Unity官网API中提供了Input类和Touch类,在该类里提供了许多接口.相信只要我们稍微看下,就可以自己应用了 ...

  6. correlated subquery and non-correlated subquery

    子查询:嵌套在其他查询中的查询称之. 子查询又称内部,而包含子查询的语句称之外部查询(又称主查询). 所有的子查询可以分为两类,即相关子查询和非相关子查询 1>非相关子查询是独立于外部查询的子查 ...

  7. MS-DOS命令列表

    以下是微软的DOS操作系统(MS-DOS)的DOS命令列表.其它DOS的命令和用法可能类似. 后期版本的 DOS 可以通过help命令来得到命令与参数列表,通过help <命令>或者< ...

  8. webform 验证控件

    验证: 一.非空验证  RequiredFieldValidator ErrorMessage - 验证出错后的提示信息 ControlToValidate - 要验证的控件的ID Display - ...

  9. android中细节效果总结

    android中细节效果总结   andorid取消最上方的标题同时全屏显示 Source code     protected void onCreate(Bundle savedInstanceS ...

  10. hprof教程

    大部分内容参考http://www.linuxidc.com/Linux/2012-04/58178.htm J2SE中提供了一个简单的命令行工具来对java程序的cpu和heap进行 profili ...