本篇文章为大家展示了如何在PHP中利用会话实现跨子域,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
<强>会话主要分两部分:强>
一个是会话数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在。
另一个是标志着会话数据的<代码>会话Id,会话Id> 代码,就是那个会话文件的文件名,<代码>会话Id> 代码是随机生成的,因此能保证唯一性和随机性,确保会话的安全。一般如果没有设置会话的生存周期,则<代码>会话Id> 代码存储在内存中,关闭浏览器后该Id自动注销,重新请求该页面后,重新注册一个<代码>会话Id> 代码。如果客户端没有禁用Cookie,则饼干在启动会话会话的时候扮演的是存储<代码>会话Id 代码>和<代码>会话生存期> 代码的角色。
两个不同的域名网站,想用同一个会话,就是牵扯到会话跨域问题!
默认情况下,各个服务器会各自分别对同一个客户端产生<代码> SESSIONID> 代码,如对于同一个用户浏览器,一个服务器产生的<代码>会话Id> 代码是11111111111,而B服务器生成的则是222222。另外,PHP的会话数据都是分别保存在本服务器的文件系统中。想要共享会话数据,那就必须实现两个目标:
一个是各个服务器对同一个客户端产生的<代码>会话Id> 代码必须相同,并且可通过同一个饼干进行传递,也就是说各个服务器必须可以读取同一个名为<代码> PHPSESSID> 代码的饼干;
另一个是会话数据的存储方式/位置必须保证各个服务器都能够访问到。这两个目标简单地说就是多服务器(A、B服务器)共享客户端的<代码>会话Id> 代码,同时还必须共享服务器端的会话数据。
<强>有三种解决方法:
强>
<强> 1。只要在PHP页面的最开始(要在任何输出之前,并且在session_start()之前)的地方进行以下设置强>
报错(& # 39;session.cookie_path& # 39;,, & # 39;/& # 39;); 报错(& # 39;session.cookie_domain& # 39;,, & # 39; .mydomain.com& # 39;); 报错(& # 39;session.cookie_lifetime& # 39;,, & # 39; 1800 & # 39;);
<强> 2。在php。ini里设置强>
session.cookie_path =/session.cookie_domain =.mydomain.com session.cookie_lifetime 1800年=,
<强> 3。在php页面最开始的地方(条件同1)调用函数
强>
session_set_cookie_params (1800,,, & # 39;/& # 39;,, & # 39; .mydomain.com& # 39;);
<强>会话有个<代码> Session_id> 代码作为会话的惟一标志。强>
要实现会话子域,实际上是在同一个浏览器中在访问两个A和B子域时,其会话是相同的。
由于会话都是保存在服务器端,如何让两台服务器识别这两个请求是由一个浏览器发出的呢?
饼干是保存在客户端的,服务器通常通过饼干来识别不同的客户端,因此,可以使用饼干来保存<代码> Session_id> 代码,并将该Cookie设置为父域。
例如,当访问a.sso.com时,就将<代码> Session_id 代码>保存在Cookie中。当访问b.sso.com时,则将<代码> Session_id> 代码,从Cookie中取出来,
并通过session_id去某个持久化容器中获取会话。
例如,当访问a.sso.com时,就将<代码> session_id 代码>保存在Cookie中。当访问b.sso.com时,则将<代码> session_id> 代码,从Cookie中取出来,
并通过<代码> session_id> 代码去某个持久化容器中获取会话。
在本实验中,使用PHP来作为实验语言。
当访问a.sso.com时,则将通过
,
session_start (); 美元,_SESSION[& # 39;简历及# 39;],=,“SBSBSBS"; ,session_id 美元;=,session_id (); ,setcookie(& # 39;名字# 39;,session_id美元,时间()+ 3600 * 24日& # 39;/& # 39;,& # 39;SSO.com& # 39;);
<强>,将session_id保存在cookie中。强>
由于在PHP中,会话是一个数组,PHP有<代码>序列化()代码>函数,将数组序列化
session_value 美元;=,序列化($ _SESSION);
然后将session_value美元<代码> 代码>保存在数据库中。
在访问b.sso.com时,则从cookie中获取到<代码> session_id> 代码,然后到数据库中根据<代码> session_id> 代码将经过序列化过的会话获取出来
接着就可以对该会话进行操作,实现会话跨子域。
由于将会话保存在数据库中,存取都是比较费时的操作,因此可以将会话保存在缓存中,例如