1、是否可能跨域共享Session信息或者怎麼實現單點登錄
二級域名和頂級域名相同,可以共享cookie。
你可以用memcache或者redis,實現tomcat各個伺服器session同步,基本上可以滿足要求了。
2、CI 的SESSION 如何跨域名使用呢?
通過ajax 的 jsonp來實現 $.ajax({ type:'get', url:' http://demo.aaa.com', dataType:"jsonp", jsonp:"jsonpcallback", data:{"參數1":""+值+"","參數2":""+值+""}, success:function(data){});
3、thinkphp 如何子域名session跨域
?
4、cookie跨域,二級域名之間如何共享
|TP5解決方案
// +----------------------------------------------------------------------
// | Cookie設置
// +----------------------------------------------------------------------
'cookie' => [
// cookie 名稱前綴
'prefix' => '',
// cookie 保存時間
'expire' => 0,
// cookie 保存路徑
'path' => '/',
// cookie 有效域名
'domain' => '', // 這里是重點
// cookie 啟用安全傳輸
'secure' => false,
// httponly設置
'httponly' => '',
// 是否使用 setcookie
'setcookie' => true,
],
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
其它
cookis 設置,讀取方法,跨域[二級域名]
$time =30;
$domain ='.111cn.net';
setcookie("abcde","aaaaaa");//最簡單的cookie設置方法
setcookie('load','www.111cn.net',time()+3600*24,'/','.111cn.net'); //這里可以設置二級域名
$cookis = $_COOKIE['loadDomain'];//讀取域名
print_r( $cookis );
/*
來看幾個例子:
簡單的:
SetCookie("MyCookie", "Value of MyCookie");
帶失效時間的:
SetCookie("WithExpire", "Expire in 1 hour", time()+3600);//3600秒=1小時
什麼都有的:
SetCookie("FullCookie", "Full cookie value", time()+3600, "/forum", ".111cn.net", 1);
*/
?>
<script language="javascript教程">
function setcookie(name,days)
{
var url = document.domain;
var exp = new Date();
exp.setTime(exp.getTime() + days*24*60*60*1000);
document.cookie = name + "="+ escape(url) +";expires="+ exp.toGMTString();
}
function getcookie(name)
{
var arr = document.cookie.match(new RegExp("[sS]*"+ name +"=([^;]*)"));
alert(arr);
if(arr != null)
return unescape(arr[1]);
return null;
}
</script>
//php教程 cookies
//asp教程 cookies
Response.Cookies("Uto")("UtorName")=UtorName
Response.Cookies("Uto")("UtorPwd")=UtorPwd
Response.Cookies("Uto").Domain="utoper.com"
Response.Cookies("Uto").Secure =False
5、php session跨域問題
php實現SESSION跨域
稍微大一點的網站,通常都會有不只一個伺服器,每個伺服器運行著不同的功能模塊或者不同的子系統,他們使用不同的二級域名,比如www.a.com、i.a.com、bbs.a.com。而一個整體性強的網站,用戶系統是統一的,即一套用戶名、密碼在整個網站的各個子系統中都是可以登錄使用的。各個伺服器共享用戶數據是比較容易實現的,只需要在後端放個資料庫伺服器,各個伺服器通過統一介面對用戶數據進行訪問即可。但還存在一個問題,就是用戶在i.a.com登錄之後,進入www.a.com時,仍然需要重新登錄,基本的通行證的問題,映射到技術上,其實就是各個伺服器之間如何實現共享 SESSION 數據的問題。
為了解決這個問題,我們採用將 SESSION 的數據保存資料庫的方式。關於PHP SESSION的掃盲這里就不在累贅。在默認情況下,各個伺服器會各自分別對同一個客戶端產生 SESSION ID,如對於同一個用戶瀏覽器,www.a.com系統產生的 SESSION ID 是,而i.a.com生成的則是。另外,PHP 的 SESSION 數據都是分別保存在本伺服器的文件系統中。
想要共享 SESSION 數據,那就必須實現兩個目標:www.a.com和i.a.com所產生的SESSION ID相同,並且可通過同一個 COOKIE 進行傳遞,也就是說各個伺服器必須可以讀取同一個名為 PHPSESSID 的 COOKIE;另一個是 SESSION 數據必須存放在一個各個系統都能訪問到的地方。簡單地說就是多伺服器共享客戶端的 SESSION ID,同時還必須共享伺服器端的 SESSION 數據。
第一個目標的實現其實很簡單,只需要對 COOKIE 的域(domain)進行特殊地設置即可,默認情況下,COOKIE 的域是當前伺服器的域名/IP 地址,而域不同的話,各個伺服器所設置的 COOKIE 是不能相互訪問的,如 www.a.com 的伺服器是不能讀寫 www.b.com 伺服器設置的 COOKIE 的。這里我們所說的同一網站的伺服器有其特殊性,那就是他們同屬於同一個一級域,如:www.a.com 和 i.a.com 都屬於域 .a.com,那麼我們就可以設置 COOKIE 的域為 .a.com,這樣 www.a.com、i.aaa.com 等等都可以訪問此 COOKIE。PHP 代碼中的設置方法如下:
1
ini_set('session.cookie_domain', '.a.com');
這樣各個系統共享同一客戶端 SESSION ID 的目的就達到了,下面就是共享SESSION數據,我們就將SESSION數據放在資料庫中,首先建立資料庫表:
1
CREATE TABLE sessions (
2
session_id varchar(32) NOT NULL,
3
session_last_access int(10) unsigned,
4
session_data text,
5
PRIMARY KEY (session_id)
session_id為主鍵,保存SESSION ID ,session_last_access是SESSION最後更新時間,session_data是SESSION數據。
PHP 提供了session_set_save_handle() 函數,可以用此函數自定義 SESSION 的處理過程,當然首先要先將 session.save_handler 改成 user,可在 PHP 中進行設置:
接下來著重講一下 session_set_save_handle() 函數,此函數有六個參數:
session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc )
各個參數為各項操作的函數名,這些操作依次是:打開、關閉、讀取、寫入、銷毀、垃圾回收。PHP 手冊中有詳細的例子,詳細代碼如下:
view sourceprint?
01
$gb_DBHOSTname = "127.0.0.1"; //主機的名稱或是IP地址
02
$gb_DBname = "dbname"; //資料庫名稱
03
$gb_DBuser = "username"; //資料庫用戶名稱
04
$gb_DBpass = "pwd"; //資料庫密碼
05
$gb_COOKIE_DOMAIN = '.a.com';
06
$SESS_DBH = "";
07
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime"); //得到session的最大有效期。
08
session_id(); //不使用 GET/POST 變數方式
09
ini_set('session.use_trans_sid', 0); //設置垃圾回收最大生存時間
10
ini_set('session.gc_maxlifetime', 13600); //使用 COOKIE 保存 SESSION ID 的方式
11
ini_set('session.use_cookies', 1);
12
ini_set('session.cookie_path', '/'); //多主機共享保存 SESSION ID 的 COOKIE
13
ini_set("session.cookie_domain", $gb_COOKIE_DOMAIN);
14
//將 session.save_handler 設置為 user,而不是默認的 files session_mole_name('user');
15
function sess_open($save_path, $session_name) {
16
global $gb_DBHOSTname, $gb_DBname, $gb_DBuser, $gb_DBpass, $SESS_DBH;
17
if (!$SESS_DBH = mysql_pconnect($gb_DBHOSTname, $gb_DBuser, $gb_DBpass)) {
18
die('MySQL Error');
19
}
20
mysql_query("SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary", $SESS_DBH);
21
if (!mysql_select_db($gb_DBname, $SESS_DBH)) {
22
die('MySQL Error');
23
}
24
return true;
25
}
26
27
function sess_close() {
28
global $SESS_DBH;
29
//$SESS_DBH->Close();
30
return true;
31
}
32
33
function sess_read($key) {
34
global $SESS_DBH, $SESS_LIFE;
35
// var_mp($SESS_DBH);
36
$qry = "select session_data from sessions where session_id = '$key' ";
37
$qid = mysql_query($qry, $SESS_DBH);
38
// var_mp($qid);
39
if (list ($value) = mysql_fetch_row($qid)) {
40
return $value;
41
}
42
return false;
43
}
44
45
function sess_write($key, $val) {
46
global $SESS_DBH, $SESS_LIFE;
47
$session_last_access = time();
48
$value = $val;
49
$qry = "insert into sessions values('$key',$session_last_access,'$value')";
50
$qid = mysql_query($qry, $SESS_DBH);
51
if (!$qid) {
52
$qry = "update sessions set session_last_access=$session_last_access, session_data='$value' where session_id='$key' ";
53
$qid = mysql_query($qry, $SESS_DBH);
54
}
55
return $qid;
56
}
57
58
function sess_destroy($key) {
59
global $SESS_DBH;
60
$qry = "delete from sessions where session_id = '$key'";
61
$qid = mysql_query($qry, $SESS_DBH);
62
return $qid;
63
}
64
65
function sess_gc($maxlifetime) {
66
global $SESS_DBH;
67
$old = time() - $maxlifetime;
68
$old = mysql_real_escape_string($old);
69
$qry = "delete from sessions where session_last_access < " . $old;
70
$qid = mysql_query($qry, $SESS_DBH);
71
return mysql_affected_rows($SESS_DBH);
72
}
73
session_mole_name();
74
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write","sess_destroy", "sess_gc");
75
session_start();
6、session怎麼解決跨域問題
何為跨域跨域session/cookie?
也就是第三方session/cookie。第一方session/cookie指的是訪客回當前訪問的網答站給訪客的瀏覽器設置的seesion /cookie,
會被存儲在訪客的計算機上。第三方session/cookie指的是當前訪問的網站中會載入(嵌入)另外第三方的網站代碼,例如促銷廣告,那麼第三方網
站也會在訪客的計算機上添加session/cookie,這種就是第三方session/cookie。
7、二級域名之間可以相互跨域嗎?
可以的,但是一定要保持內容的相關性,不搭邊的內容不要跨域。
8、session跨域共享怎麼實現
首先一點,你要明白session的大部分實現都是通過cookie的,所以跨域session是不可能的。
但跨專域的認證還是可以有屬OAuth等實現方法,但不太推薦OAuth項目貌似爛尾了,隨然大家都在用。
其次雖然跨域有點難,但放在同一域下的不同項目是可以共享session的,CAS也不算復雜,你可以上github搜一下redis-session這個項目,只有一個源代碼文件,它給出了redis下session的一種nodejs實現,就是設置redis的超時來模擬session的超時。
再次,跨域也是可以的,就是使用iframe,在登錄時,在多個域下同時寫cookie,注意瀏覽器差異。
綜上,你的想法完全可行。
9、關於把session存入資料庫中實現跨域!
記得小時候有道物理作抄業,說是怎樣才能在高原地區將鍋中的雞蛋煮熟,別的同學說是用高壓鍋,我記得我的答案是在鍋邊上圍上一圈布,也可以將雞蛋煮熟,直到十幾年後的今天,我仍然能夠清晰的記得老師的評語是血淋淋的九個大字:
想法很好,但事倍功半!
我希望能以一個普通網友的身份,將這句話也送給你。