最近在发现使用Taobao的时候的一个小细节,于是便萌发起了写这篇文章。
当我们在 www.taobao.com 中进行登录之后,然后直接切换到 www.tmall.com 域名下,发现www.tmall.com首页的最顶部马上显示成了: 您好, andyfaces。 首先,用户名应该是存储在cookie中的,于是在taobao.com的域名中用 firefox看到用户名确实是存储在 cookie, 而tmall.com中没有存储该cookie:
可以确定的是对于cookie来说肯定是不允许垮域访问的。无论是通过JS还是Server端程序来说都是如此,那么tmall.com是如何访问到taobao.com下的cookie的呢?
于是打开 tmall.com,然后使用firebug来进行调试,发现了一条这样的请求语句,
其页面的JS代码为:
Js代码
<script>
KISSY.getScript("http://www.taobao.com/go/app/tmall/login-api.php?"+Math.random())
</script>
看到这里之后于是也大概知道他如何处理了的,为了确认一下,于是搜索一下 KISSY.getScript 函数代码,确实采用了JS跨域的 JSONP 解决方案:
Js代码
getScript: function(url, success, charset) {
var isCSS = RE_CSS.test(url),
node = doc.createElement(isCSS ? 'link' : 'script'),
config = success, error, timeout, timer;
node.src = url;
node.async = true;
scriptOnload(node, function() {
if (timer) {
timer.cancel();
timer = undef;
}
S.isFunction(success) && success.call(node);
// remove script
if (head && node.parentNode) {
head.removeChild(node);
}
});
head.insertBefore(node, head.firstChild);
}
其原理是通过动态create js include 动态加载js,然后为该script节点bind onload事件或判断onreadystatechange,其具体细节可以参考以上 scriptOnload 的函数的处理。 当js加载完成之后 采用回调方式来执行 success 函数。
为了进一步确实,于是使用 Jquery的 $.getScript 来测试一把,首先在 taobao.com下进行登录成功,然后随便在本地写了一个测试页,通过以下语句:
Js代码
$.getScript('http://www.taobao.com/go/app/tmall/login-api.php?0.6783450077710154', function(){
console.log("the taobao.com cookie object:" + userCookie + " username:" + userCookie._nk_);
});
Firbug结果:
其实大致原理如此,通过在www.taobao.com 的server端提供一个获取当前域下所有cookie的 php的请求地址,然后该php获取到cookie之后将期并成 js 代码,也就是以上第二个截图所看到的。然后再在 tmall 采用 jsonp 的方式跨域加载该 js 代码,从而实现 cookie 的跨域访问。
分享到:
相关推荐
Dubbox跨域请求,配置CORS服务来解决跨域问题,亲测可用。
跨域访问解决方案,关于跨域访问cookie的资料
因为cookie在跨域的情况下,浏览器根本不允许互相访问的限制,为了突破这个限制,所以有了以下这个实现方案,使用postmessage和localstorage进行数据跨域共享。 原理比较简单,但是遇到的坑也不少,这里梳理一下,做...
跨域获取cookie方法-附件资源
主要介绍了Vue axios 跨域请求无法带上cookie的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下
自从入了 Vue 之后,一直在用 axios 这个库来做...下面这篇文章主要给大家介绍了关于axios中cookie跨域及相关配置的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
cookie跨域后端代码,主要解决跨域的问题,在servlet部分,供初学者使用
前后端分离必定面临跨域问题,以下是两个跨域请求携带cookie的nginx服务,完美演示跨域请求携带cookie
该文件可以通过代码实例,让你清楚的理解session和cookie的意思,当你明白了这点,你就可以设计出来单点登录功能,同一账号在同一时间只能登录一次功能。同时你可以通过ie、firefox去测试你对session、cookie的理解...
对于写网站时需要跨域和跨浏览器的可以看看这个。 引入jquery 和 swfstore.min.js 就可以了,蛮简单好用的,会jquery基础就可以咯。 mySwfStore.set('myKey', '值'); //设置flashcookie mySwfStore.get('myKey')...
解决方法是: 代码如下: //www.B.com里的被调用的页面需要写P3P头,从而解除IE对写Cookie的阻止 context.Response.AddHeader(“P3P”, “CP=CAO PSA OUR”); //www.A.com里通过ajax调用www.B.com里的内容时,是跨域...
iframe 跨域访问session问题解决方法
其他系统可以共享这个cookie。但是新的四台服务器中并没有申请域名,只有四个ip: 192.168.0.1 单点登录服务器 192.168.0.2 192.168.0.3 192.168.0.4 因为每台服务器有两个项目,都用到单点登录,所以通过修改新的...
在A域中存放openid.aspx 在B域中调用A域的openid.aspx 调用方法: ...B域根据这个标识来确定是否更新自己域的cookie,每次更新后都需刷新页面一次,这个刷新动作已经在openid.aspx中完成,不用自己再写。
针对单点登录中的跨域身份认证问题,提出了一种基于可变Cookie的方案解决跨域单点登录,使用随机数字...通过对票据产生和传输以及Cookie加密和常见攻击的安全性分析,可以实现跨域单点登录的功能并保证身份认证安全可信。
asp.net cookie跨域小例子,这是httpwebrequest的这种方式来做的。 要想测试这个跨域,我们需要修改本地的host文件,配置两个域名,例如 127.0.0.1 www.xj5u.com 127.0.0.1 cc.xj5u.com 第一个项目绑定第一个域名...