Rumah > pembangunan bahagian belakang > tutorial php > PHP 使用session对两个不同的服务器网站进行同步登录

PHP 使用session对两个不同的服务器网站进行同步登录

WBOY
Lepaskan: 2016-06-23 14:18:54
asal
922 orang telah melayarinya

PHP session 跨域  登录 

现在有两个服务器
a:www.test1.com
b:www.test2.com
我想在test1里面进行登录,然后在test2里面也同样进行登录,请问这个该怎么写?

我有部分测试代码如下
在test1登录的时候,如果登录成功那么就执行下面
$fp = pfsockopen("www.test2.com",80,$errorno,$errormsh);//连接服务器		if ($fp){    			$out = "GET /login.php?acc=".$acc."&psw=".$psw." HTTP/1.1\r\n";       			$out.= "Host:www.test2.com\r\n";       			$out.= "Connection: Close\r\n\r\n";            			fputs($fp, $out);    			fclose($fp);   		}
Salin selepas log masuk


然后在www.test2.com里面的login.php文件
$acc = $_GET['acc'];$psw = $_GET['psw'];$_SESSION['acc'] = $acc;$_SESSION['psw'] = $psw;
Salin selepas log masuk


然后我访问www.test2.com
发现session为空啊
求高手指教!


回复讨论(解决方案)

如果单点登录这么容易搞得话,那些 SSO 服务商不都要倒闭了?

session 依靠 cookie 携带的 sessionid 做唯一性识别
而正常的 cookie 是不能跨域的。虽然利用一些技术手段可以实现 cookie 跨域,但这毕竟是利用了规则上的漏洞,并不可取。

我们知道,如果一个网站有设置了失效期的 cookie 的话,当浏览结束时就会在浏览器缓冲区留下一个以该网站域名的 cookie 文件。当再次访问该网站时,这个上次保存的 cookie 就会被发送回去

因此,你只要在访问 www.test1.com 的时候,设法留下一个 www.test2.com 的 cookie 文件
那么你再访问 www.test2.com 的时候就能实现同步了

怎么留?在 www.test1.com 返回的页面中用 iframe 或 js 访问一下 www.test2.com 的特定文件

当然,这只是基础,需要考虑的问题远不止这点

如果单点登录这么容易搞得话,那些 SSO 服务商不都要倒闭了?

session 依靠 cookie 携带的 sessionid 做唯一性识别
而正常的 cookie 是不能跨域的。虽然利用一些技术手段可以实现 cookie 跨域,但这毕竟是利用了规则上的漏洞,并不可取。

我们知道,如果一个网站有设置了失效期的 cookie 的话,当浏览结束时就会在浏览器缓冲区留下一个以该网站域名的 cookie 文件。当再次访问该网站时,这个上次保存的 cookie 就会被发送回去

因此,你只要在访问 www.test1.com 的时候,设法留下一个 www.test2.com 的 cookie 文件
那么你再访问 www.test2.com 的时候就能实现同步了

怎么留?在 www.test1.com 返回的页面中用 iframe 或 js 访问一下 www.test2.com 的特定文件

当然,这只是基础,需要考虑的问题远不止这点
那请问老大,我这样处理行不行
在www.test2.com里面的login.php文件里面写上创建cookie的代码

setcookie("acc",$acc,time()+3600,'/');
Salin selepas log masuk

这样,是不是在我访问www.test2.com的时候这个cookie会直接发送页面
然后我在访问的时候加上一个对cookie的判断是否就行了?

只要 www.test2.com/login.php 是在 www.test1.com 返回的页面 里面调用的就可以
就是说你在访问 www.test1.com 的同时也访问了 www.test2.com
这样 www.test1.com 的 cookie 供访问 www.test1.com 用
www.test2.com 的 cookie 供访问 www.test2.com 用

只要 www.test2.com/login.php 是在 www.test1.com 返回的页面 里面调用的就可以
就是说你在访问 www.test1.com 的同时也访问了 www.test2.com
这样 www.test1.com 的 cookie 供访问 www.test1.com 用
www.test2.com 的 cookie 供访问 www.test2.com 用
怎么样才叫做在返回的页面里面调用?
www.test1.com里面index.php
使用登录成功之后访问www.test2.com的方法,这个算不算是调用了!
实际情况是这样
www.test1.com里面login.php里面登录成功之后使用,

$fp = pfsockopen("www.test2.com",80,$errorno,$errormsh);//连接服务器        if ($fp){                $out = "GET /login.php?acc=".$acc."&psw=".$psw." HTTP/1.1\r\n";                   $out.= "Host:www.test2.com\r\n";                   $out.= "Connection: Close\r\n\r\n";                         fputs($fp, $out);                fclose($fp);           }
Salin selepas log masuk

然后后面就直接跳转会www.test1.com里面index.php页面了
www.test2.com里面login.php中就写上了cookie
setcookie("acc",$acc,time()+3600,"/");//写文件,查看是否访问以及写入cookie成功$fp = fopen("test.txt","w");fwrite($fp,"acc:".$_COOKIE['acc']);fclose($fp);
Salin selepas log masuk


我刚才测试了一下,发现test.txt文件存在,里面也有数据
然后我就去访问www.test2.com
在页面上加入了var_export($_COOKIE);
打出来的数据并没有我写入的东西,为什么?
这样算不算老大你刚才说的“在 www.test1.com 返回的页面里面调用”

“在 www.test1.com 返回的页面里面调用”是指请求是从浏览器发出的,这样返回的 cookie 才会被浏览器保存

“在 www.test1.com 返回的页面里面调用”是指请求是从浏览器发出的,这样返回的 cookie 才会被浏览器保存

echo "<iframe style='display:none' src='www.test2.com/login.php?acc=".$acc."psw='".$psw."'></iframe>";
Salin selepas log masuk

我在登录之后是用来这样的
别的不动,结果cookie还不没有我写入的数据,而且文件都创建不出来了,是不是我太笨了?
这写错了?还是应该用别的方法,求老大指教!

把session单独存入数据库或者memcache之类的”内存数据库”中,然后各个网站读取的时候全部从session 数据库中获取

把session单独存入数据库或者memcache之类的”内存数据库”中,然后各个网站读取的时候全部从session 数据库中获取
简单明了。大版有什么高见呢。。

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan