|
最近在發xian使用Taobao的时候的一个xiao细jie,于是便萌发起了写这篇文章。
dang我men在 www.taobao.com 中jin行登录之后,然hou直接切換到 www.tmall.com 域ming下,发现www.tmall.comshou页的最顶部马上顯示成了”您好, andyfaces“,于是便对此处的实现机制進行fen析。
首先,用户名应该是Cun储在cookie中的,于是在taobao.com的域名中用 firefox看Dao用户名确实是存储在 cookie, 而tmall.com中没有存储該cookie:
可以确定的shidui于cookie来说肯定shi不允许垮域访问的。无论是tong过JS还是Serverduan程序来说都shi如ci,那么tmall.com是如何访問到taobao.comxia的cookie的呢?
于是打开 tmall.com,然后使用firebuglaijin行调試,发xian了一條这样的请求语句,
其頁面DeJS代碼为:
Js代码
<script>
KISSY.getScript("http://www.taobao.com/go/app/tmall/login-api.php?"+Math.random())
</script>
<script>
KISSY.getScript("http://www.taobao.com/go/app/tmall/login-api.php?"+Math.random())
</script>
看到这里zhi后于是也大gai知dao他如何处理le的,为le確认一xia,于shi搜索一下 KISSY.getScript 函数dai码,確實采用了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);
}
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,ranhou為该script节dianbind onload事件或判断onreadystatechange,qi具体细节可以参kao以上 scriptOnload De函数的处理。 dangjs加zaiwan成之后 采yong回diao方式来执行 success 函数。
为了进一步确实,于是使用 Jquery的 $.getScript 来测試一把,首先zai taobao.com下进行登录成gong,ran后随便zaiben地写了一个測试页,通过以xia語句:
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_);
});
$.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结果:
其实大zhi原理如此,通过在www.taobao.com 的server端提供一ge获取当qian域下所有cookieDe php的请求地址,然后该php獲qu到cookiezhi后将期并成 js 代码,ye就是以上第二个截图所看到的。然后再在 tmall 采用 jsonp De方式跨域加载该 js 代码,从而实现 cookie 的跨域訪问。
大小: 51.1 KB
大xiao: 28.8 KB
大小: 28.5 KB
cha看圖片附件
欢迎来DaoJava学习者论坛,转載请注明地址:http://www.javaxxz.com. |
|