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

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

WBOY
Release: 2016-06-23 14:18:54
Original
923 people have browsed it

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);   		}
Copy after login


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


然后我访问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,'/');
Copy after login

这样,是不是在我访问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);           }
Copy after login

然后后面就直接跳转会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);
Copy after login


我刚才测试了一下,发现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>";
Copy after login

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

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

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

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template