PHP中实现跨子域会话的三种方法
以前做事的时候Session通常直接存在于数据库中,可以解决跨域的问题,而不仅仅是跨子域的问题。但是,今天遇到的问题是,你要修改别人现有的东西。因为当时只有子域认为一定有简单的解决办法,杜娘找到了三个解决办法:
会议主要分为两部分:
一个是Session数据,默认情况下存储在服务器的tmp文件中,作为文件存在。
另一个是标记会话数据的Sessionid,它是会话文件的文件名。会话标识是随机生成的,可以保证唯一性和随机性,保证会话的安全性。一般来说,如果没有设置会话的生命周期,会话标识会存储在内存中,浏览器关闭后会自动注销,重新请求页面后会重新注册会话标识。如果客户端没有禁用cookie,则cookie在启动会话时会起到存储会话id和会话生存期的作用。
两个不同域名的网站,如果要使用同一个Session,就会涉及到Session的跨域问题!
默认情况下,每台服务器将为同一个客户端生成SESSIONID。比如同一个用户浏览器,服务器A生成的SESSION ID为1111111111,而服务器B生成的SESSION ID为22222。另外,PHP的SESSION数据存储在这个服务器的文件系统中。如果您想要共享SESSION数据,您必须实现两个目标:
一个是每个服务器为同一个客户端生成的SESSION ID必须相同,并且可以通过同一个COOKIE传输,也就是说每个服务器必须能够读取同一个名为PHPSESSID的COOKIE;
另一个是SESSION数据的存储模式/位置必须确保所有服务器都可以访问它。这两个目标只是多个服务器(A和B服务器)共享客户端的SESSION ID,并且还必须共享服务器的SESSION数据。
有三种解决方案:
1.只需在php页面的开头(在任何输出之前和session_start()之前)进行以下设置
ini_set('session.cookie_path ','/');ini_set('session.cookie_domain ', mydomain.com ');ini _ set(' session . cookie _ lifetime ',' 1800 ');2.在php.ini中设置
会话。cookie _ path=/session。cookie _ domain=. my domain.comsession . cookie _ lifetime=18003。调用php页面开头的函数(条件与1相同)
session_set_cookie_params(1800,'/', mydomain.com ');会话具有会话标识作为会话的唯一符号。
要实现Session子域,其实在同一个浏览器中访问两个A、B子域时,它们的会话是一样的。
由于会话存储在服务器端,两个服务器如何识别这两个请求是由一个浏览器发出的?
cookie存储在客户端,服务器通常通过cookie识别不同的客户端。因此,您可以使用cookie来保存Session_id,并将cookie设置为父域。
例如,当访问a.sso.com时,session_id保存在Cookie中。访问b.sso.com时,会话标识会从Cookie中删除,
并通过会话标识从持久容器中获取会话。
例如,当访问a.sso.com时,session_id保存在Cookie中。访问b.sso.com时,会话标识会从Cookie中删除,
并通过会话标识从持久容器中获取会话。
本实验采用PHP作为实验语言。
参观a.sso.com时,它会过去的
session _ start();$ _ SESSION[' person ']=' SBS SBS ';$ session _ id=session _ id();setcookie('name ',$session_id,time() 3600*24,'/',' SSO.com ');将session_id保存在cookie中。
因为会话在PHP中是一个数组,所以PHP有一个serialize()函数来序列化数组
$ SESSION _ value=serialize($ _ SESSION);然后在数据库中保存$session_value。
当访问b.sso.com时,会话标识从cookie中获取,然后根据会话标识从数据库中获取序列化的会话
然后,可以操作会话来实现会话跨子域。
将会话保存在数据库中是一项耗时的操作,因此可以将会话保存在缓存中,如memcached或redis。
这样,对会话的访问操作会更快。
使用缓存的另一个优点是会话通常有一定的生存期。如果它存在于数据库中,则有必要保存会话的生存期。检索会话时,需要判断会话是否无效。
使用缓存存储会话可以在存储时设置其生存时间,减少取出后判断失败的过程。
我的解决方案是在入口处添加以下代码:
ini_set('session.cookie_path ','/');ini_set('session.cookie_domain ', JB 51 . net ');//请注意,jb51.net被您自己的域名ini _ set ('session)所取代。cookie _ lifetime ',' 1800 ');如图所示:
地点一
站点2
可见两个站点的PHPSESSID是一样的,这当然解决了跨域名的问题
以上就是在PHP中实现跨子域会话的几种解决方案,希望对有需要的大家有所帮助。
版权声明:PHP中实现跨子域会话的三种方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。