Session跨域問題

2022-08-03 06:12:14 字數 3003 閱讀 2358

session主要分兩部分:  

乙個是session資料,該資料預設情況下是存放在伺服器的tmp檔案下的,是以檔案形式存在,而非儲存在伺服器的記憶體中;     另乙個是標誌著session資料的session id,session id,就是那個 session 檔案的檔名,session id 是隨機生成的,因此能保證唯一性和隨機性,確保 session 的安全。一般如果沒有設定 session 的生存週期,則 session id 儲存在記憶體中,關閉瀏覽器後該 id 自動登出,重新請求該頁面後,重新註冊乙個 session id。如果客戶端沒有禁用 cookie,則 cookie 在啟動 session 會話的時候扮演的是儲存 session id 和 session 生存期的角色。

兩個不同的網域名稱**,想用同乙個session,就是牽扯到session跨域問題!   通過了解 session 的工作原理,我們可以發現,在預設情況下,各個伺服器會各自分別對同乙個客戶端產生 sessionid,如對於同乙個使用者瀏覽器,a 伺服器產生的 session id 是 30de1e9de3192ba6ce2992d27a1b6a0a,而b 伺服器生成的則是 c72665af28a8b14c0fe11afe3b59b51b。另外,php 的 session資料都是分別儲存在本伺服器的檔案系統中。想要共享 session 資料,那就必須實現兩個目標:      乙個是各個伺服器對同乙個客戶端產生的session id 必須相同,並且可通過同乙個 cookie 進行傳遞,也就是說各個伺服器必須可以讀取同乙個名為 phpsessid 的cookie;另乙個是 session 資料的儲存方式/位置必須保證各個伺服器都能夠訪問到。這兩個目標簡單地說就是多伺服器(a、b伺服器)共享客戶端的 session id,同時還必須共享伺服器端的 session 資料。     

第乙個目標的實現其實很簡單,只需要對 cookie 的域(domain)進行特殊地設定即可(setcookie()函式中的第4個引數),預設情況下,cookie 的域是當前伺服器的網域名稱/ip 位址,而域不同的話,各個伺服器所設定的 cookie 是不能相互訪問的,如 www.aaa.com的伺服器是不能讀寫 www.bbb.com伺服器設定的 cookie 的。這裡我們所說的同一**的伺服器有其特殊性,那就是他們同屬於同乙個一級域,如:aaa.cocoglp.com 和www.cocoglp.com 都屬於域 .cocoglp.com,那麼我們就可以設定 cookie 的域為 .cocoglp.com,這樣 aaa.cocoglp.com、www.cocoglp.com等等都可以訪問此cookie。這樣各個伺服器共享同一客戶端 session id 的目的就達到了。     

第二個目標的實現可以使用資料庫來儲存session 資料,這樣各個伺服器就可以方便地訪問同乙個資料來源,獲取相同的session 資料了;或者是通過檔案共享方式,如 nfs 方式,但設定、操作上有些複雜。      如果用資料庫儲存session資料的話,可能會有遺留問題,就是如果**的訪問量很大的話,session 的讀寫會頻繁地對資料庫進行操作,這樣效率就會明顯降低,好像這裡就可以用到c來寫段程式存放session在記憶體中,而不必每次運算元據庫了....

session主要分兩部分:  

乙個是session資料,該資料預設情況下是存放在伺服器的tmp檔案下的,是以檔案形式存在,而非儲存在伺服器的記憶體中;     另乙個是標誌著session資料的session id,session id,就是那個 session 檔案的檔名,session id 是隨機生成的,因此能保證唯一性和隨機性,確保 session 的安全。一般如果沒有設定 session 的生存週期,則 session id 儲存在記憶體中,關閉瀏覽器後該 id 自動登出,重新請求該頁面後,重新註冊乙個 session id。如果客戶端沒有禁用 cookie,則 cookie 在啟動 session 會話的時候扮演的是儲存 session id 和 session 生存期的角色。

兩個不同的網域名稱**,想用同乙個session,就是牽扯到session跨域問題!   通過了解 session 的工作原理,我們可以發現,在預設情況下,各個伺服器會各自分別對同乙個客戶端產生 sessionid,如對於同乙個使用者瀏覽器,a 伺服器產生的 session id 是 30de1e9de3192ba6ce2992d27a1b6a0a,而b 伺服器生成的則是 c72665af28a8b14c0fe11afe3b59b51b。另外,php 的 session資料都是分別儲存在本伺服器的檔案系統中。想要共享 session 資料,那就必須實現兩個目標:      乙個是各個伺服器對同乙個客戶端產生的session id 必須相同,並且可通過同乙個 cookie 進行傳遞,也就是說各個伺服器必須可以讀取同乙個名為 phpsessid 的cookie;另乙個是 session 資料的儲存方式/位置必須保證各個伺服器都能夠訪問到。這兩個目標簡單地說就是多伺服器(a、b伺服器)共享客戶端的 session id,同時還必須共享伺服器端的 session 資料。     

第乙個目標的實現其實很簡單,只需要對 cookie 的域(domain)進行特殊地設定即可(setcookie()函式中的第4個引數),預設情況下,cookie 的域是當前伺服器的網域名稱/ip 位址,而域不同的話,各個伺服器所設定的 cookie 是不能相互訪問的,如 www.aaa.com的伺服器是不能讀寫 www.bbb.com伺服器設定的 cookie 的。這裡我們所說的同一**的伺服器有其特殊性,那就是他們同屬於同乙個一級域,如:aaa.cocoglp.com 和www.cocoglp.com 都屬於域 .cocoglp.com,那麼我們就可以設定 cookie 的域為 .cocoglp.com,這樣 aaa.cocoglp.com、www.cocoglp.com等等都可以訪問此cookie。這樣各個伺服器共享同一客戶端 session id 的目的就達到了。     

第二個目標的實現可以使用資料庫來儲存session 資料,這樣各個伺服器就可以方便地訪問同乙個資料來源,獲取相同的session 資料了;或者是通過檔案共享方式,如 nfs 方式,但設定、操作上有些複雜。      如果用資料庫儲存session資料的話,可能會有遺留問題,就是如果**的訪問量很大的話,session 的讀寫會頻繁地對資料庫進行操作,這樣效率就會明顯降低,好像這裡就可以用到c來寫段程式存放session在記憶體中,而不必每次運算元據庫了....

session 與cookie 跨域問題

session與cookie會話可能常常要用到跨域 因為最近我也在工作中遇到這樣的情況 所以 我要與大家分享一下我的個人經驗 我在網上也搜到了一些資料 大部分都是加p3p 也就是 response.setheader p3p cp cao psa our 表頭 那麼加在 了?這個我想有的很少用過 或...

跨域Session超時問題處理

在乙個系統中有兩個應用a與b,其中a為主應用,b為報表應用,asession為30分鐘,b的session為20分鐘,使用者第一次登入a後,會自動登入b,此時系統計算b的session時間。有些情況下使用者在a應用上會一直停留,比如一小時,那一小時後,b的session已經失效,同理在b應用上停留時...

解決跨域訪問session丟失問題

問題 前後端兩個專案,前段訪問後端api,前段用angularjs 後端用的express,設定res.header access control allow origin 可以跨域訪問,正常查詢資料庫返回。但是遇到有許可權檢查的api就不行,一直提示需要登陸。搜了下資料,是因為跨域問題,每次get...