常用跨域共用session的是登錄模塊,我相信很多開發(fā)的朋友的都遇到過,只需要一個地方登錄,相關(guān)聯(lián)的網(wǎng)站也是處于登錄狀態(tài)。兩種情況:一種9streets.cn和a.9streets.cn之間,另一種是 之間,這幾天總結(jié)了一下處理方法。 方式一: 在一,二級域名下調(diào)用如下代碼: <?php include("DBsession.php"); $_SESSION['usssser_oke'] = 'xxssssss'; $_SESSION['user_oke'] = 'xxsss'; ?> DBsession.php <?php /** /** 直接引用api QQ登錄的session寫法,配置相關(guān)配置才行哈 * 設(shè)置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的主機(jī)地址 const db_host = "localhost"; //需要第三方指定ip地址 //數(shù)據(jù)庫用戶名 const db_user = "root"; //需要第三方指定自己的用戶名 //數(shù)據(jù)庫密碼 const db_pwd = ""; //需要第三方指定自己的庫據(jù)庫密碼 //數(shù)據(jù)庫 const db_name = "thinkphp"; //需要第三方指定數(shù)據(jù)庫 //數(shù)據(jù)庫表 const db_table = "tbl_session"; //需要第三方指定數(shù)據(jù)表 //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是站點的主域名,請注意前面?zhèn)€有一個'.' */ define("MAIN_DOMAIN", ".ichezone.com"); //設(shè)置主域名 /** * 不同子域名下共享session信息 * COOKIE_DOMAIN = false 禁止該功能 * COOKIE_DOMAIN = true 啟用該功能 * 默認(rèn)禁止 * 開啟前提需要定義MAIN_DOMAIN常量 */ define("COOKIE_DOMAIN", true); if (defined("COOKIE_DOMAIN") && COOKIE_DOMAIN) { if (defined("MAIN_DOMAIN")) @ini_set("session.cookie_domain", MAIN_DOMAIN); } /** * 同一個主域名,不同服務(wù)器之間共享session信息 * USER_SESSION = false 禁用該功能 * USER_SESSION = true 啟用該功能 * 默認(rèn)禁止 * 開啟前提需要建立mysql數(shù)據(jù)表 */ ini_set('session.name', 'phpsessid');//設(shè)置色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復(fù)制內(nèi)容到剪貼板 <?php ini_set('session.name', 'sid');//設(shè)置色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');//多主機(jī)共享保存 SESSION ID 的 COOKIE,注意此處域名為一級域名 session_start(); $_SESSION['usssser_oke'] = 'xxssssss'; $_SESSION['user_oke'] = 'xxsss'; ?> 第三種方式: PHP Code復(fù)制內(nèi)容到剪貼板 一級域名: 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復(fù)制內(nèi)容到剪貼板 一級域名: ini_set("session.cookie_domain",'.ichezone.com');//注:該參數(shù)必須在sesson_start()之上,否則將不會生效 session_start(); $_SESSION['user_name'] = '梁山www良民'; 二級域名: ini_set("session.cookie_domain",'.ichezone.com');//注:該參數(shù)必須在sesson_start()之上,否則將不會生效 session_start(); $_SESSION['user_nassse'] = '梁山www良民'; 第五種方式: 采用的p3p技術(shù),實現(xiàn)原理,在訪問網(wǎng)站x.com的時候,y.com程序觸發(fā)y.com文件的寫入sessionid值,sessionid值便可以獲取,然后把seesion值存入數(shù)據(jù)庫,取相同的sessionid值便可。這就要求y.com里面的程序文件必需能跨域訪問,默認(rèn)情況下,瀏覽器是不能跨域設(shè)置cookie的,加上p3p頭后才行。在對應(yīng)php文件加上: PHP Code復(fù)制內(nèi)容到剪貼板 header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); 這里直接引用網(wǎng)上的一篇博文了: 127.0.0.1 www. 127.0.0.1 www. 首先:創(chuàng)建 a_setcookie.php 文件,內(nèi)容如下: <?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, "/", "."); ?> 然后:創(chuàng)建 a_getcookie.php 文件,內(nèi)容如下: <?php var_dump($_COOKIE); ?> 最后:創(chuàng)建 b_setcookie.php 文件,內(nèi)容如下: <script src="http://www./a_setcookie.php?id=www."></script> ---------------------------- 三個文件創(chuàng)建完畢后,我們通過瀏覽器依次訪問: http://www./b_setcookie.php http://www./a_getcookie.php 我們會發(fā)現(xiàn),在訪問域的時候,我們并沒有在域設(shè)置上cookie值。去掉重新訪問兩文件設(shè)置成功 |
|