`

实现多域名下共用一个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 下还是不行

 

 

分享到:
评论

相关推荐

    利用Linux下的NAT功能实现多机共用一个IP地址.pdf

    "利用Linux下的NAT功能实现多机共用一个IP地址" 本文主要介绍了如何利用Linux下的NAT功能实现多机共用一个IP地址。NAT(Network Address Translation,网络地址转换)是一种使多台计算机共用一个公网IP地址的技术。...

    c#多项目\应用程序共用一个Config配置文件

    c#多个项目共用一个Config配置文件 c#多个应用程序共用一个Config配置文件

    Nginx一个域名访问多个项目的方法实例

    最近在个人的多个项目部署中遇到这样一个问题,一个域名如何实现多个项目的访问。因为不想自己单独去申请域名证书和域名配置,便想到了这个方案,结合Nginx的location功能实现了自己的需求,便记录下来。示例中是以...

    浏览器多窗口共用session引发的混乱

    NULL 博文链接:https://vearn.iteye.com/blog/376407

    多个软件共用一个串口.rar

    一个电脑上多软件共用一个串口的方法

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

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

    增加和修改共用一个页面

    关于增加和修改共用一个页面的代码节省了页面的编写

    使用nat123可以让多个内网共用同域名80端口

    通过nat123操作,可以在内网搭建服务器,并让外网访问,无需公网IP,无需路由映射,做网站无需备案。nat123支持所有TCP协议的内外网服务。...只有一个域名,怎么让多个网站共用这个域名80端口呢?nat123就搞定。

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

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

    多个cs-winform项目共用同一个app.config配置文件

    一个c#大项目下,有好几个小的cs程序子项目,net默认的配置文件是 程序a.exe.config、程序b.exe.config,这样一些本来可以共用的设置,就需要设置好多遍,不便于程序安装部署。 用了同一个配置文件,不让他们分散读...

    详解Tomcat多域名配置(多个项目共用80端口)

    本篇文章主要介绍了Tomcat多域名配置(多个项目共用80端口),具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    多台机器共用鼠标键盘方法

    多台机器共用鼠标键盘方法 配置2台机器,一个台式机,一个笔记本,来回切换键盘和鼠标比较麻烦,就想使用一套键盘鼠标来控制2台电脑,使用VNC可以实现。

    两个或多个域名共用一个空间并可以独立访问的方法

    步骤如下: 1、首先,你的空间必须支持ASP,并且这个空间可以绑定下面所用到的两个域名(域名绑定可以让空间服务商帮你做),然后新建一个ASP的首页文件,这个ASP文件中的代码如下: 代码如下: &lt;&#37;if Request...

    Android Aidl跨进程访问parcelable接口,实现3个app共用一个服务

    Android Aidl跨进程访问parcelable接口数据,简单封装了下AIDL作为一个library被其他3个app引用,实现3个app共用一个服务,3个app中任意打开一个app开启服务,其他两个app共用此服务获取接口数据。

    Nginx 同IP 多域名 HTTPS SSL 配置

    IIS 7.5 以下版本不支持多域名共用443端口 SSL 服务,采用nginx 单独处理来自443端口的请求,从而实现多域名 SSL 附件包含,图文设置nginx, nginx免安装包,可直接使用,已支持SNI(Server Name Indication)

    PHP实现负载均衡下的session共用功能

    本文实例讲述了PHP实现负载均衡下的session共用功能。分享给大家供大家参考,具体如下: 最近忙于开发台湾运动彩券第四版的程序,所以已经很久没有上来写东西了,今天随便写点东西和大家分享. 首先说一下负载均衡,相信...

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

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

    Element实现表格嵌套、多个表格共用一个表头的方法

    res 的 ext 属性下的三个数组 default 、 free 、 pay ,每一个数组要大的一行(这一行中,第一列是运送到的地址的名字,这里定义的是 area 属性,但后端是未给到这个字段的,可自己处理数据添加该字段

Global site tag (gtag.js) - Google Analytics