session 有个Session_id 作为session的惟一标志。
要实现Session子域,实际上是在同一个浏览器中在访问两个A 和B子域时,其session是相同的。
由于session都是保存在服务器端,如何让两台服务器识别这两个请求是由一个浏览器发出的呢?
Cookie是保存在客户端的,服务器通常通过Cookie来识别不同的客户端,因此,可以使用Cookie来保存Session_id, 并将该Cookie设置为父域。
例如,当访问a.sso.com 时,就将session_id 保存在Cookie中。当访问b.sso.com时,则将session_id 从Cookie中取出来,
并通过session_id 去某个持久化容器中获取Session。
在本实验中,使用PHP来作为实验语言。
当访问a.sso.com时,则将通过
session_start();
$_SESSION['person'] = "SBSBSBS";
$session_id = session_id();
setcookie('name',$session_id,time()+3600*24,'/','SSO.com');
将session_id 保存在cookie中。
由于在PHP中,session是一个数组,PHP有 serialize() 函数,将数组序列化
$session_value = serialize($_SESSION);
然后将$session_value 保存在数据库中。
在访问b.sso.com时,则从cookie中获取到session_id,然后到数据库中根据session_id将 经过序列化过的session 获取出来
接着就可以对该session进行操作,实现session 跨子域。
由于将session保存在数据库中,存取都是比较费时的操作,因此可以将session保存在缓存中,例如memcached 或者redis中,
这样对session的存取操作就比较快速了。
使用缓存还有个好处就是,通常session有一定得存活时间,如果存在数据库中,还需要保存该session的存活时间,在取出session时,还需要判断其是否失效。
使用缓存存放session就可以在存放的时候设置其存活时间,减少了取出后的失效判断这一个过程。