谈谈跨域那些事
跨域是很多phper,jser都会遇到的一个问题.解决数据在不同域名之间传递有很多方法,比如jsonp,比如setcookie,写入redis做持久化存储等.关于用哪种方式去处理跨域问题,仁者见仁智者见智,我根据我实际问题来分析.
前段时间我遇到了两个域下面的系统之间保持登录状态和权限的需求.
问题描述和目标:a.test.com和b.test.com,在a.test.com登录后,去b.test.com拥有同样的登录状态和权限.
关于登录状态,在我的需求里面只是简单的需要传递用户登录名.权限方面由于项目刚起来,我对auth的划分比较粗糙,暂用简单的token方式来判断.
思路理清之后,开始技术选型.
有人第一个想到的就是cookie.cookie在客户端存储,可以被轻易篡改.但是如果我只是传递用户登录名,使用setcookie,并无什么安全性的担心.即使被改了,对于我们来说也并没有什么卵用.所以我暂定用cookie跨域.php代码如下:
// some codes about login.
setcookie("login_name", $username, time()+3600, "/", ".test.com");
我加在登录认证后去写cookie.
而在b.test.com里面,我去获取该cookie数值,php代码如下:
if (isset($_COOKIE['login_name'])) {
$username = $_COOKIE['login_name'];
// other logic codes
}
用户名的传递已经finish.还剩token的传递,如果使用cookie就显得不是非常安全,可以考虑jsonp和其他方式去存储token.
关于jsonp的用法,已经有很多人写过(互相抄,中国特色).以我的理解就是利用script元素可以跨域的特性,配合jsonpcallback实现.但是在我的场景里面,并不适合用jsonp,我想以更background方式去实现.于是我用了redis共享token.
实际上就是登录后写入redis,在b.test.com里面去读redis里面的同名key的value,写入当前域下的session.持久化存储永远是最安全的方法之一.