今天有时间,看了一下cookie跨域问题。总结一下
问题引入:淘宝公司有两个域名:taobao.com 和 tmall.com。但是淘宝和tmall共用一套会员体系,因此就存在跨域访问的问题。某用户在taobao.com下登录后(此时taobao域下的cookie中会保存该用户已经登录的信息),然后该用户访问tmall.com,但是由于跨域cookie不能访问的问题。会导致用户在tmall域下需要重新登录。淘宝是如何解决这个问题的呢?具体描述参见:淘宝如何跨域获取Cookie分析 。
淘宝如何跨域获取Cookie分析 一文中分析了淘宝如何保持不同域下cookie的一致性。在tmall.com加载的时候,发送一个ajax请求。通过jsonp的方式获取taobao域下公用的cookie。然后通过js将这些公用的cookie设置到tmall域下。解决了cookie不能公用的问题。
下面对其中使用的一些技术做一些解释。
1.同源策略
所谓:同源策略(同源指域名、协议、端口相同,一个著名的安全策略),一般来说位于server1.example.com的网页无法与不是server1.example.com的服务器沟通,而HTML的<script>元素是一个例外。利用<script>元素的这个开放策略,网页可以得到从其他来源动态产生的JSON资料,而这种使用模式就是所谓的JSONP。
2.JSONP
JSONP(JSON with Padding)是资料格式JSON的一种“使用模式”,可以让网页从别的网域要资料。另一个解决这个万恶他的方式是跨来源资料共享。
关于JSONP的一个详细介绍参见《关于JSONP》,《javascript(jquery getJSON) 跨域的操作(Jsonp和java操作例子)》一文中详细描述了javascript跨域操作的方法。
3.关于js回调函数:
《js回调函数(callback)》一文详细描述了js回调函数的意义:
4.js设置cookie的方法
ps:
《通过设置P3P解决跨域不能设置cookie的问题》一文描述了跨域设置cookie的问题,这其中要注意的点:这里的跨域设置cookie是指:
所谓的cookie跨域,并不是taobao.com试图去设置tmall.com的cookie,而是taobao.com试图去设置taobao.com的cookie,但是这个过程是在一个tmall.com的域里进行的。