- 常用跨域共用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值。去掉重新訪問兩文件設置成功
處理session跨域幾種的方案
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.