gpt4 book ai didi

php实现多站点共用session实现单点登录的方法详解

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章php实现多站点共用session实现单点登录的方法详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本文实例讲述了php实现多站点共用session实现单点登录的方法。分享给大家供大家参考,具体如下:

最近闲来无事,总结整理下单点登录的问题.

单点登录的基本原理为:客户端共享sesionid,服务器端共享session信息。通过共同的sessionid在服务器端获得相同session信息,即可达到单点登录(即多站点共享用户信息,一处登录,处处可用)的目的.

单点登录分为两种情况:

1、站点部署在同一个服务器,且使用同一个二级域名 。

这种情况下,比较好解决.

1、首先解决站点在客户端sessionid(存在cookie中)的共享问题。使用ini_set()函数即可指定cookie的域,如下: ini_set('session.cookie_domain', '.xxxx.com');//设置服务器cookie的域,xxxx为公用二级域名 。

2、其次解决站点在服务端的session信息的共享。因为站点在同一个服务器,所以生成的session文件是可以公用的,可以直接使用sessionid获取对应的session信息.

2、站点部署在不同的服务器,使用不同域名 。

这种情况比较复杂,因为站点在不同服务器使用不同域名,在客户端不能使用ini_set设置cookie的作用域,在服务器端也是各自生成自己的session文件,不能共用,但还是用解决的办法.

1、首先解决客户端sessionid同步问题.

假设我们有三个站点,域名分别是aa.com,bb.com,cc.com。我们在aa.com上建立一个共用的登陆入口login.php,三个网站的登陆请求全部跳转到该页面。代码流程如下:

?
1
2
3
4
5
6
7
$back = login( $name , $pwd ); //执行登陆操作,成功就写入session
//如果登录成功,进行以下操作流程
if ( $back ){
   $sessionid = session_id();
   $key = encode( $session , $keyword ); //生成安全码
   //输出一个登陆成功提示页,并跳转到请求登陆的站点
}

在登陆成功html提示页面中添加如下代码,利用iframe标签请求需要同步登陆的站点 。

php实现多站点共用session实现单点登录的方法详解

aa.com和cc.com站点的set_cookie.php文件如下 。

?
1
2
3
4
5
//解密$key
decode( $key );
//把当前站点的sessionid设置为传递的sessionid
session_id( $_GET [ 'sessionid' ]);
session_start();

2、解决三个站点服务器端共享session的问题.

前面已经说过,因为三个站点不在同一个服务器,因此会生成各自的session文件,如果想要共享这些文件,又面临跨域等一系列问题。所以我们转化思路,不使用文件保存session信息,而是把session信息保存到数据库中。这样,只要获得session信息的sessionid,任何站点都可以访问相同的session信息.

我们创建一个mysql_session.php文件,用于存储session信息到数据库,代码如下 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
$gb_DBname = "test" ;            //数据库名称
$gb_DBuser = "root" ;            //数据库用户名称
$gb_DBpass = "" ;              //数据库密码
$gb_DBHOSTname = "127.0.0.1" ;        //主机的名称或是IP地址
$SESS_DBH = "" ;              //数据库对象
session_module_name( "User" );      //定义session存储按用户定义的方式
$SESS_LIFE =get_cfg_var( "session.gc_maxlifetime" ); //得到session的最大有效期,也可以自定义
function sess_open( $save_path , $session_name )
{
   global $gb_DBHOSTname , $gb_DBname , $gb_DBuser , $gb_DBpass , $SESS_DBH ;
   if (! $SESS_DBH =mysql_pconnect( $gb_DBHOSTname , $gb_DBuser , $gb_DBpass )){
   echo "MySql Error:" .mysql_error(). "" ;
   die ();
   }
   if (!mysql_select_db( $gb_DBname , $SESS_DBH )){
   echo "MySql Error:" .mysql_error(). "" ;
   die ();
   }
   return true;
}
function sess_close(){
return true;
}
function sess_read( $key )
{
   global $SESS_DBH , $SESS_LIFE ;
   $qry = "select value from db_session where sesskey = '$key' and expiry > " .time();
   $qid =mysql_query( $qry , $SESS_DBH );
   if (list( $value )=mysql_fetch_row( $qid )){
   return $value ;
   }
   return false;
}
//写入session信息。保存session信息的数据表名为:db_session
//除了主键自增id,需要的字段如下
//sesskey  sessionid
//values  session值
//expiry  session的到期日期
function sess_write( $key , $val )
{
   global $SESS_DBH , $SESS_LIFE ;
   $expiry =time()+ $SESS_LIFE ;
   $value = $val ;
   $qry = "insert into db_session values('$key',$expiry,'$value')" ;
   $qid =mysql_query( $qry , $SESS_DBH );
   if (! $qid ){
   $qry = "update db_session set expiry=$expiry, value='$value' where sesskey='$key' and expiry >" .time();
   $qid =mysql_query( $qry , $SESS_DBH );
   }
   return $qid ;
}
function sess_destroy( $key )
{
   global $SESS_DBH ;
   $qry = "delete from db_session where sesskey = '$key'" ;
   $qid =mysql_query( $qry , $SESS_DBH );
   return $qid ;
}
function sess_gc( $maxlifetime )
{
   global $SESS_DBH ;
   $qry = "delete from db_session where expiry < " .time();
   $qid =mysql_query( $qry , $SESS_DBH );
   return mysql_affected_rows( $SESS_DBH );
}
session_set_save_handler( "sess_open" , "sess_close" , "sess_read" , "sess_write" , "sess_destroy" , "sess_gc" );

之后在需要使用session的页面中,在session_start()之前引入该文件,其他的跟平时使用seesion一样就可以了。你会发现你赋值的session已经被存进了数据库中.

希望本文所述对大家PHP程序设计有所帮助.

原文链接:https://blog.csdn.net/u012830303/article/details/82252708 。

最后此篇关于php实现多站点共用session实现单点登录的方法详解的文章就讲到这里了,如果你想了解更多关于php实现多站点共用session实现单点登录的方法详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com