常用跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了一下处理方法。
方式一:
在一,二级域名下调用如下代码:
<?php
include("DBsession.php");
$_SESSION['usssser_oke'] = 'xxssssss';
$_SESSION['user_oke'] = 'xxsss';
?>
DBsession.php
<?php
/**
/** 直接引用api QQ登录的session写法,配置相关配置才行哈
* 设置session配置
*/
/**
* CREATE TABLE `tbl_session` (
* `session_id` varchar(255) binary NOT NULL default '',
* `session_expires` int(10) unsigned NOT NULL default '0',
* `session_data` text,
* PRIMARY KEY (`session_id`)
* ) ENGINE=MyISAM;
*/
class Session
{
//mysql的主机地址
const db_host = "localhost"; //需要第三方指定ip地址
//数据库用户名
const db_user = "root"; //需要第三方指定自己的用户名
//数据库密码
const db_pwd = ""; //需要第三方指定自己的库据库密码
//数据库
const db_name = "thinkphp"; //需要第三方指定数据库
//数据库表
const db_table = "tbl_session"; //需要第三方指定数据表
//mysql-handle
private $db_handle;
//session-lifetime
private $lifeTime;
function open($savePath, $sessName)
{
// get session-lifetime
$this->lifeTime = get_cfg_var("session.gc_maxlifetime");
// open database-connection
$db_handle = @mysql_connect(self::db_host, self::db_user, self::db_pwd);
$dbSel = @mysql_select_db(self::db_name, $db_handle);
// return success
if(!$db_handle || !$dbSel)
return false;
$this->db_handle = $db_handle;
return true;
}
function close()
{
$this->gc(ini_get('session.gc_maxlifetime'));
// close database-connection
return @mysql_close($this->db_handle);
}
function read($sessID)
{
// fetch session-data
$res = @mysql_query("SELECT session_data AS d FROM ".self::db_table."
WHERE session_id = '$sessID'
AND session_expires > ".time(), $this->db_handle);
// return data or an empty string at failure
if($row = @mysql_fetch_assoc($res))
return $row['d'];
return "";
}
function write($sessID, $sessData)
{
// new session-expire-time
$newExp = time() + $this->lifeTime;
// is a session with this id in the database?
$res = @mysql_query("SELECT * FROM ".self::db_table."
WHERE session_id = '$sessID'", $this->db_handle);
// if yes,
if(@mysql_num_rows($res))
{
// ...update session-data
@mysql_query("UPDATE ".self::db_table."
SET session_expires = '$newExp',
session_data = '$sessData'
WHERE session_id = '$sessID'", $this->db_handle);
// if something happened, return true
if(@mysql_affected_rows($this->db_handle))
return true;
}
else // if no session-data was found,
{
// create a new row
@mysql_query("INSERT INTO ".self::db_table." (
session_id,
session_expires,
session_data)
VALUES(
'$sessID',
'$newExp',
'$sessData')", $this->db_handle);
// if row was created, return true
if(@mysql_affected_rows($this->db_handle))
return true;
}
// an unknown error occured
return false;
}
function destroy($sessID)
{
// delete session-data
@mysql_query("DELETE FROM ".self::db_table." WHERE session_id = '$sessID'", $this->db_handle);
// if session was deleted, return true,
if(@mysql_affected_rows($this->db_handle))
return true;
// ...else return false
return false;
}
function gc($sessMaxLifeTime)
{
// delete old sessions
@mysql_query("DELETE FROM ".self::db_table." WHERE session_expires < ".time(), $this->db_handle);
// return affected rows
return @mysql_affected_rows($this->db_handle);
}
}
/**
* 指定session有效的域名
* ini_set("session.cookie_domain", ".domain.com");
* .domain.com是站点的主域名,请注意前面个有一个'.'
*/
define("MAIN_DOMAIN", ".ichezone.com"); //设置主域名
/**
* 不同子域名下共享session信息
* COOKIE_DOMAIN = false 禁止该功能
* COOKIE_DOMAIN = true 启用该功能
* 默认禁止
* 开启前提需要定义MAIN_DOMAIN常量
*/
define("COOKIE_DOMAIN", true);
if (defined("COOKIE_DOMAIN") && COOKIE_DOMAIN)
{
if (defined("MAIN_DOMAIN"))
@ini_set("session.cookie_domain", MAIN_DOMAIN);
}
/**
* 同一个主域名,不同服务器之间共享session信息
* USER_SESSION = false 禁用该功能
* USER_SESSION = true 启用该功能
* 默认禁止
* 开启前提需要建立mysql数据表
*/
ini_set('session.name', 'phpsessid');//设置色session id的名字
define("USER_SESSION", true);
if (defined("USER_SESSION") && USER_SESSION)
{
@ini_set("session.save_handler", "user");
$session = new Session;
@session_module_name("user");
@session_set_save_handler(
array(&$session, "open"),
array(&$session, "close"),
array(&$session, "read"),
array(&$session, "write"),
array(&$session, "destroy"),
array(&$session, "gc"));
}
//@ini_set("session.save_path", dirname(__file__)."/tmp");
//@session_id("demo");
//ini_set("session.save_path",dirname(__file__)."/tmp");
session_start();
include("DBsession.php");
$_SESSION['usssser_oke'] = 'xxssssss';
$_SESSION['user_oke'] = 'xxsss';
?>
方式二:
PHP Code复制内容到剪贴板
<?php
ini_set('session.name', 'sid');//设置色session id的名字
ini_set('session.use_trans_sid', 0);//不使用 GET/POST 变量方式
ini_set('session.use_cookies', 1);//使用 COOKIE 保存 SESSION ID 的方式
ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.ichezone.com');//多主机共享保存 SESSION ID 的 COOKIE,注意此处域名为一级域名
session_start();
$_SESSION['usssser_oke'] = 'xxssssss';
$_SESSION['user_oke'] = 'xxsss';
?>
第三种方式:
PHP Code复制内容到剪贴板
一级域名:
session_start();
setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".ichezone.com");
$_SESSION['user_name'] = '梁山良民';
二级域名:
session_id($_COOKIE['session_id']);
session_start();
$_SESSION['user_sssme'] = 222222;
第四种方式:
PHP Code复制内容到剪贴板
一级域名:
ini_set("session.cookie_domain",'.ichezone.com');//注:该参数必须在sesson_start()之上,否则将不会生效
session_start();
$_SESSION['user_name'] = '梁山www良民';
二级域名:
ini_set("session.cookie_domain",'.ichezone.com');//注:该参数必须在sesson_start()之上,否则将不会生效
session_start();
$_SESSION['user_nassse'] = '梁山www良民';
第五种方式:
采用的p3p技术,实现原理,在访问网站x.com的时候,y.com程序触发y.com文件的写入sessionid值,sessionid值便可以获取,然后把seesion值存入数据库,取相同的sessionid值便可。这就要求y.com里面的程序文件必需能跨域访问,默认情况下,浏览器是不能跨域设置cookie的,加上p3p头后才行。在对应php文件加上:
PHP Code复制内容到剪贴板
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
这里直接引用网上的一篇博文了:
127.0.0.1 www.a.com
127.0.0.1 www.b.com
首先:创建 a_setcookie.php 文件,内容如下:
<?php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("test", $_GET['id'], time()+3600, "/", ".a.com");
?>
然后:创建 a_getcookie.php 文件,内容如下:
<?php
var_dump($_COOKIE);
?>
最后:创建 b_setcookie.php 文件,内容如下:
<script src="http://www.a.com/a_setcookie.php?id=www.b.com"></script>
----------------------------
三个文件创建完毕后,我们通过浏览器依次访问:
http://www.b.com/b_setcookie.php
http://www.a.com/a_getcookie.php
我们会发现,在访问b.com域的时候,我们并没有在a.com域设置上cookie值。去掉重新访问两文件设置成功
参见:http://www.9streets.cn/art-php-578.html
相关推荐
处理Session跨域问题通常涉及到多个网站或应用之间共享用户身份验证信息。Session是Web应用程序用来存储用户特定数据的一种机制,通常存储在服务器端,而Session ID通过Cookie在客户端与服务器之间传递。当用户在...
跨域访问`session`的解决方案有以下几种: 1. **P3P(Platform for Privacy Preferences)**:这是一种由W3C提出的隐私偏好平台标准,允许跨域`cookie`的设置。通过在响应头中添加`P3P`政策,服务器告诉浏览器它...
在探讨如何解决iframe跨域与session失效的问题之前,我们需要了解几个重要的概念:什么是跨域,什么是session以及cookie。 首先,跨域问题通常出现在Web应用中,尤其是在使用iframe嵌入第三方网站内容时。在Web技术...
对于跨域环境下的用户鉴权,有几种常见的解决方案: 1. **CORS with credentials**:启用CORS时,设置`Access-Control-Allow-Credentials`为`true`,允许携带认证信息(如cookie)的跨域请求。但这种方式要求服务器...
两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了一下处理方法。 无论是一二级域名,和不同域名下的跨域,无非要达到两点: 客户端访问同一个sessionId, 所有域名对应的...
Spring Session提供了一种统一的会话管理机制,可以将session数据存储在集中式存储如Redis中,解决了跨域、集群环境下的session同步问题。 Redis则是一个高性能的键值数据库,常被用作缓存和消息代理。在本案例中,...
在ASP.NET中实现跨子域共享SESSION,主要有以下几种方法: 1. **Cookie-Based Sharing**: 这是最常见的方法,通过设置Cookie的`Domain`属性来实现。将Session ID存储在Cookie中,并设置Cookie的域为父域,如`....
P3P(Platform for Privacy Preferences)是一种网页隐私偏好平台,通过P3P头,可以向浏览器声明网站的安全策略,从而允许浏览器接受来自跨域子页面的cookie和session,确保session可以被正确保存和维护。...
`jQuerySession.js`提供了几个核心方法,包括`setSession()`, `getSession()`, 和 `removeSession()`。 - **setSession(key, value)**:用于设置Session中的键值对。例如,要存储用户名,可以这样做: ```...
3. 跨域问题:如果Web应用存在多个域名,需要考虑跨域Session共享的问题,可能需要使用Cookie的`Domain`属性或采用其他解决方案。 4. 移动端适配:移动设备可能禁用Cookie,因此需要考虑其他机制(如URL参数、Local ...
在开发Web应用时,用户身份验证和会话管理是一个关键环节。当用户session失效时,通常...同时,这也是一种常见的跨域问题解决方案,因为跨域请求同样需要在服务器端返回正确的响应头信息,以便客户端进行相应的处理。
本文将详细介绍几种常见的C# Session丢失问题及其解决办法。 首先,Session状态丢失的原因可能有以下几种: 1. 杀毒软件扫描Web.Config文件。由于Web.Config文件包含了应用程序配置信息,包括Session状态的设置,...
- **跨域请求处理**:在使用HTTP客户端库(如`HttpURLConnection`)进行跨域请求时,需要注意手动添加Session ID以维持登录状态。 通过上述示例代码的学习,可以帮助开发者更好地理解和应用PHP中的Session和Cookies...
- **ThinkPHP框架的session跨域问题**:框架可能有自己的会话管理机制,需要配置框架的会话设置,或者使用 `header()` 函数手动设置跨域允许。 - **ThinkPHP的cookie和session冲突**:确保没有自定义的 `setcookie()...
此外,还有一种解决方案是使用SQLServer模式存储Session,这将Session数据存储在SQL Server数据库中,提供更高的稳定性和可扩展性。配置方式同样是修改`<sessionState>`元素,将`mode`设置为`SQLServer`,并提供相应...
在axis2+spring的环境下,可以通过两种方式处理session: - **SOAP Header**:可以将session信息封装在SOAP消息的Header部分,每次请求时携带。 - **Cookie**:客户端和服务端可以通过Cookie来维护会话状态,但...
总结,jQuery Session库为开发者提供了一个轻量级的解决方案,以处理与session相关的任务。它使得在JavaScript中操作session变得更加方便,减少了与服务器的交互,提高了应用性能。但需要注意,对于高安全性需求的...
David Borsos 在伦敦的微服务大会上提出了以下几种方案: 1. **单点登录 (SSO)** - **解释**:用户只需登录一次即可访问所有相互信任的应用系统。 - **实现方案**: - **同域方案**:所有子系统的顶级域名相同,...
在Web开发中,会话管理和用户身份验证是至关重要的部分,而`cookie`和`session`是两种常用的技术。本文将深入探讨`cookie`的概念、禁用处理以及它与`session`的区别,以帮助理解它们在实际应用中的作用。 ### 1. ...
Spring Session 是一个基于 Spring Framework 的会话管理解决方案,它旨在提供一种跨服务器、分布式会话管理的方法。在大型分布式系统中,传统的 HTTP 会话管理方式往往难以满足需求,Spring Session 提供了一种统一...