`

实现多域名下共用一个SESSION

阅读更多

要实现多域名共享session,首先就得了解SESSION的运行机制。基本概念我就不说了。
session是这样运行的:
用户A访问站点Y,如果站点Y执行了session_start();(以下假定session_start()总是存在)那么会产生一个 session_id,这个session id一般会以COOKIE的形式保存到用户A(我们可以通过在php.ini里设置session.use_only_cookies为1,强制SESSION ID必须以COOKIE传递。)。这时候SESSION ID表现为$_COOKIE['PHPSESSID'];(PHPSESSID可用session_name()函数来修改)
用户A接着访问,这个session id($_COOKIE['PHPSESSID'])就会在A每次访问Y的时候传送到站点Y。
在站点Y上,会有这么一个目录,是用来保存SESSION的实际数据的。站点Y接收到session id,然后通过session id,来获得与SESSION数据的关联,并返回SESSION数据。

可能聪明的你已经想到了,既然服务器端和客户端之间的SESSION是通过一个SESSION ID来联系,并且SESSION数据是以普通文件的形式保存在一个特定的文件夹里。
那么我们要实现不同域名,只需要满足以下两个条件:

  • 1)不同域名的SESSION数据目录统一到一起,或者同步更新。
  • 2)对同一个客户,使用统一的一个SESSION ID

第一个条件的实现。
如果是同一台服务器,就不需要进行任何设置了。
如果是集群/分布式的,那么我想也不需要我来说了。。能做分布式应用的,在目录共享方面的经验应该比我丰富。我也没有进行过多服务器的测试,主客观条件的原因都有。

我在这里主要是想说一下第二个条件——使不同的域名,拥有统一的SESSION ID。
那我们应该怎么统一呢?
首先必须在不同域名之间传递这个SESSION ID,且由于 cookie必须是针对域名的,所以传递动作是由客户端来完成。如果传递过程不是由客户端来完成,那么接受传递的域名就不知道针对的是哪个客户。

其次就是修改接受传递的域名下的SESSION ID。

如何传递:
HTML里,我们可以使用很多种方法。例如
iframe
<iframe src=”"></iframe>
或者.js
<script type=”text/javascript” src=”"></script>
或者是一个img html元素
<img src=”" />
只要能调用某个地址,就行。

在wml里,由于wml script的特点,我们无法使用script这样的形式来调用,而wml里也没iframe..但是我们还是可以通过img来实现传递的。

如何修改:
既然SESSION ID一般情况下是通过COOKIE来传递,那么我们只需要通过传递$_COOKIE['PHPSESSID'];即可。但是如果PHPSESSID被session_name改变了,我们又得修改setcookie中的PHPSESSID..这样就会变得很麻烦。。所以我们可以选择一个session特有的函数session_id来修改$_COOKIE['PHPSESSID'];

需要注意的几点:

  • 如果session.use_only_cookies为0(PHP默认),那么session id有可能会以url或其他形式传递
  • session_id()和session_name必须在session_start()前使用

以下是我写的一个简单的实现多域名的类。如果上面的看不太明白,可以看看我的这个多域名类。这个类是在HTML下以iframe形式实现的。

 

/*
	
	使用:
	服务器A,服务器B,在A的index.php登陆,在B里建立一个接收SESSION的文件,例如ses_get.php
	A的index.php做如下修改
	最开始加上session_start();
	<body></body>里,任意一个地方写上:mdSession::_set('B/ses_get.php')
	而ses_get.php则在开头写上mdSession::_get();
	@作者:surfchen@gmail.com http://www.surfchen.org/
	*/
<?php
class mdSession
{
	
	function mdSession()
	{
		
	}
	function set($urls)
	{
		if (!is_array($urls))
		{
			$urls=array($urls);
		}
		foreach ($urls as $value)
		{
			echo '<span style="position:absolute;visibility:hidden"><iframe src="'.$value.'?'.session_id().'"></iframe></span>';
		}
		return true;
	}
	function get()
	{
		session_id($_SERVER['QUERY_STRING']);
		session_start();
		return true;
	}
	function _set($urls)
	{
		$obj=new mdSession();
		return $obj->set($urls);
	}
	function _get()
	{
		$obj=new mdSession();
		return $obj->get();
	}
}
?>

 

index.php :

<?php

  include "mdSession.php";

 

session_start();

$_SESSION['php']="yogurt8";

mdSession::_set('http://www.b.com/ses_get.php');

var_dump($_SESSION);

?>

 

ses_get.php

<?php

 include "mdSession.php";

mdSession::_get();

?>

 

b.php :

 

session_start();

var_dump($_SESSION);

 

先访问 http://www.a.com/a.php 然后在 http://www.b.com/b.php 看效果

 

在firefox 与谷歌浏览器是没问题,但在 Ie 下还是不行

 

 

分享到:
评论

相关推荐

    常用跨域共用session的是登录模块

    常用跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了...

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

    本文实例讲述了php实现多站点共用session实现单点登录的方法。分享给大家供大家参考,具体如下: 最近闲来无事,总结整理下单点登录的问题。 单点登录的基本原理为:客户端共享sesionid,服务器端共享session信息。...

    Yii2下session跨域名共存的解决方案

    前面谈过session相关配置,在开发的时候,常需要跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间...

    C#两个账号同时登录,后登录的账号将前一个账号挤掉

    综上所述,实现"同一个账号只能登录一次"涉及到多方面的技术和策略,包括会话管理、数据库交互、分布式系统支持以及安全措施。通过这些方法,可以有效地维护系统的稳定性和用户的安全体验。在实际开发中,需要根据...

    Cookie,Session开发大全

    "使用母板用cookie登录,在母版页验证"这一主题,指的是在多页面应用中,母版页(Master Page)通常承载了共用的头部和底部,包括登录状态的显示。通过在母版页中检查Cookie中的Session ID,可以实现跨页面的用户...

    php实现session共享的实例方法

    现在稍微大一点的网站基本上都有好几个子域名,比如www.xz577.com, xz577.com, vip.xz577.com,这些网站如果需要共用用户登录信息,那么就需要做到session共享,当然前提是有相同的主域名。 PHP的session原理? ...

    PHP在同一域名下两个不同的项目做独立登录机制详解

    在PHP编程中,当同一域名下存在多个独立的项目时,如何实现这些项目之间的独立登录机制是一个常见的问题。默认情况下,由于PHP使用相同的session_id(默认为PHPSESSID)进行会话管理,导致在一个项目中登录后,其他...

    Nginx配置同一个域名同时支持http与https两种方式访问实现

    在Nginx配置中,使同一个域名同时支持HTTP和HTTPS两种访问方式是非常常见的需求,这有助于提供更安全的网络服务,同时确保与不支持HTTPS的旧客户端兼容。以下是详细的配置步骤和注意事项: 首先,我们需要创建两个`...

    apachehttpserver与tomcat多域名集成(连接)配置步骤[归类].pdf

    通过以上步骤,你可以实现Apache HTTP Server与Tomcat的多域名集成,使得多个域名可以共用一套硬件资源,同时利用Apache的静态文件处理能力优化性能,以及通过负载均衡策略提高系统稳定性。记得在生产环境中,安全性...

    cookie应用(javascript)

    同时,要注意Cookie的限制:每个域名下的Cookie数量有限制,且单个Cookie的大小不能超过4KB。因此,不适合存储大量或敏感数据。此外,Cookie是通过HTTP头部传输的,这意味着它们会随着每一个请求被发送,可能会增加...

    php通过会话控制实现身份验证实例

    为了实现这一点,可以在一个中央位置(比如一个数据库或者缓存系统)中存储所有子系统共用的session数据。当用户访问任何一个子系统时,该子系统都会向中央位置查询session数据,如果验证通过,则用户可以访问其资源...

    TLS协议详解(RFC2246)

    - **Server Name Indication (SNI)**:允许在一个IP地址上托管多个域名,解决了多域名共用IP地址时的安全问题。 - **Session Resumption**:允许客户端和服务器重用之前协商的会话状态,从而加快后续连接的建立速度...

    tomcat 源码 zip

    - **Host**: 负责管理多个Context,对应于域名或IP地址。 - **Engine**: 是整个服务器的顶级容器,管理多个Host。 3. **Coyote组件** Coyote是Tomcat的网络通信引擎,它实现了Servlet规范中的Connector接口。...

    RCS5_1_advanced_communications_specification_version1

    - **多IMS服务设备架构**:允许设备同时连接到多个IMS域,以实现更丰富的功能和服务。 ##### **2.3 配置流程** RCS5提供了一套完善的配置机制,以确保设备和服务能够高效运行。 - **首次启动**:当RCScapable设备...

    Discuz 自动同步登陆的完美解决办法

    1. **UCenter**:Discuz通常与UCenter配合使用,UCenter是一个用户中心管理平台,可以统一管理多个应用(如论坛、博客等)的用户账户,实现跨应用的单点登录(Single Sign-On, SSO)。 2. **Cookie管理**:自动同步...

    TongWeb6.0用户使用手册.pdf

    - **应用上下文共用Session**:支持多个应用共享同一个Session,便于实现跨应用的数据共享。 ### 第5章 JDBC配置 #### 5.1 JDBC数据源概述 - **JDBC数据源概述**:介绍了TongWeb6.0中关于JDBC数据源的基本概念和...

    2021-2022计算机二级等级考试试题及答案No.13651.docx

    - **解释**: “综合业务数字网”(ISDN)是一种数字通信网络标准,允许语音和数据服务共用同一个网络连接,从而实现了“上网通话两不误”的特点。其英文缩写为**B. ISDN**。 #### 8. 计算机输出设备 - **知识点**: ...

Global site tag (gtag.js) - Google Analytics