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

时间:2022-08-31 11:21:09
现在有两个服务器
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);   
}


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


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

8 个解决方案

#1


如果单点登录这么容易搞得话,那些 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 的特定文件

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

#2


引用 1 楼 xuzuning 的回复:
如果单点登录这么容易搞得话,那些 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,'/');

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

#3


只要 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 用

#4


引用 3 楼 xuzuning 的回复:
只要 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);   
        }

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


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

#5


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

#6


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


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

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

#7


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

#8


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

简单明了。大版有什么高见呢。。

#1


如果单点登录这么容易搞得话,那些 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 的特定文件

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

#2


引用 1 楼 xuzuning 的回复:
如果单点登录这么容易搞得话,那些 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,'/');

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

#3


只要 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 用

#4


引用 3 楼 xuzuning 的回复:
只要 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);   
        }

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


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

#5


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

#6


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


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

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

#7


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

#8


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

简单明了。大版有什么高见呢。。