多域名登陆无非是共享登陆信息,对于父子级域名来说,比如www.demo.php7.com 和 www.php7.com,只要在配置好session就可以了;而对于不属于父子级站点来说,比如www.php7.com 和 www.site.com,客户端 cookie 中只有 sessionId ,登录相关信息全部在服务端,通过 sessionId 在服务端即可获取登录信息,可以这么理解,只要 www.php7.com 、www.site.com具有相同的 sessionId ,那么在服务端他们就可以根据相同 sessionId 拿到登录状态,也就共享了登录信息。
浏览器访问任何一个未登录网站(例如www.php7.com)都跳转到 www.site.com/domainA.php 登录中心进行登录,登录成功后设置登录状态,并设置 cookie 保存 sessionId ,其中 domain=.site.com, 此时 ,site.com 包括其子域名都能成功获取到 sessionid ,然后带着 sessionId 参数跳转到 http://php7.com/domainB.php?sessionid=123456&redirect_url=sx.com/xx.htm , php7.com/domainB.php 分析出 sessionId 后进行存储,然后跳转到 php7.com目标页,此时这个页面是登录状态的。
关键代码
<?php
//site : www.php7.com
session_start();
if(isset($_SESSION['login']) && $_SESSION['login']){
echo 'login success';
}elseif(isset($_GET['session_id'])){
echo $_GET['session_id'];
// $_COOKIE['PHPSESSID'] = $_GET['session_id'];
setcookie('PHPSESSID',$_GET['session_id'],0);
}else{
$url = "http://www.site.com/codePHP/CrossDomain/domainA.php?redirect_url=php7.com/code/crossDomain/domainB.php";
header("Location:$url");
}
//www.site.com
if(isset($_SESSION['login'])){
echo 'login out';
unset($_SESSION['login']);
}else{
$user = $_GET['user']??'';
$pass = $_GET['pass']??'';
if(empty($user)){
// echo $_GET['redirect_url'];die;
// header("Location:http://www.site.com/codePHP/crossDomain/index.html?redirect_url=".$_GET['redirect_url']);
include './domain.html';
}else{
$domain = new DomainA();
$res = $domain->check($user,$pass);
if($res){
$_SESSION['login'] = true;
if(isset($_GET['redirect_url'])){
$url = "http://www.".$_GET['redirect_url']."?session_id=".session_id();
header("Location:$url");
}
echo 'login success,session_id:'.session_id();
}else{
echo 'the user or pass of account is error';
}
}
}
这时候我访问www.php7.com,检测未登陆就会跳转到www.site.com登陆页面
登陆成功就会跳转回原来的页面
这时候我再刷新页面,就会显示登陆成功了