一直在使用session儲存資料,一直沒有好好總結一下session的使用方式以及其工作原理,今天在這裡做一下梳理。
這裡的介紹主要是基於php語言,其他的語言操作可能會有差別,但基本的原理不變。
在php中如何操作session
session_start(); //使用該函數開啟session功能
$_SESSION //使用預定義全域變數操作資料
unset($_SESSION['key']) //銷毀一個session的值
簡單地操作,一切都是由伺服器實現;由於處理在後台,一切看起來也很安全。但是session採用什麼樣機制,又是怎樣被實現,並且如何來保持會話的狀態的呢?
session實現與工作原理
瀏覽器和伺服器採用http無狀態的通訊,為了保持用戶端的狀態,使用session來達到這個目的。然而服務端是怎麼樣標示不同的用戶端或使用者呢?
這裡我們可以使用生活中的一個例子,假如你參加一個晚會,認識了很多人,你會採取什麼方式來區分不同的人呢!你可能根據臉型,也有可能根據使用者的名字,或者人的身份證,即採用一個獨一無二的標示。在session機制中,也採用了這樣的一個唯一的session_id來標示不同的使用者,不同的是:瀏覽器每次請求都會帶上由伺服器為它產生的session_id。
簡單介紹一下流程:當Client Access Server時,伺服器根據需求設定session,將會話資訊儲存在伺服器上,同時將標示session的session_id傳遞給用戶端瀏覽器,瀏覽器將這個session_id儲存在記憶體中(還有其他的儲存方式,例如寫在url中),我們稱之為無到期時間的cookie。瀏覽器關閉後,這個cookie就清掉了,它不會存在使用者的cookie臨時檔案。以後瀏覽器每次請求都會額外加上這個參數值,再伺服器根據這個session_id,就能取得用戶端的資料狀態。
如果用戶端瀏覽器意外關閉,伺服器儲存的session資料不是立即釋放,此時資料還會存在,只要我們知道那個session_id,就可以繼續通過請求獲得此session的資訊。但是這個時候背景session還存在,但是session的儲存有一個到期時間,一旦超過規定時間沒有用戶端請求時,他就會清除這個session。
下面介紹一下session的儲存機制,預設的session是儲存在files中,即以檔案的方式儲存session資料。在php中主要根據php.ini的配置session.save_handler來選擇儲存session的方式。
這裡順便說明一下,如果要做伺服器的lvs,即多台server的話,我們一般使用memcached的方式session,否則會導致一些請求找不到session。
一個簡單的memcache配置:
session.save_handler = memcachesession.save_path = "tcp://10.28.41.84:10001"
當然如果一定要使用files檔案快取,我們可以將檔案作nfs,將所有的儲存session檔案定位到一個地方。剛才講返回給使用者的session-id最終儲存在記憶體中,這裡我們也可以設定參數將其儲存在使用者的url中。
執行個體問題
現有系統A, B; 假設A系統是可以獨立啟動並執行web系統,即可以和瀏覽器直接處理session, B系統是基於mobile的,需要調用A系統的功能介面,在保持A不改變的情況下,即登陸驗證,session儲存都不變的情況下,B系統能處理前端使用者的請求。
這裡提供的方案是使用PHP實現,在使用者登陸成功後,將儲存的session的session-id返回給B系統,然後B系統每次請求其他介面都帶session_id。A系統在session_start前加上session_id(session_id);這樣B系統就能安全的調用A。
http://www.bkjia.com/PHPjc/752501.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/752501.htmlTechArticle一直在使用session儲存資料,一直沒有好好總結一下session的使用方式以及其工作原理,今天在這裡做一下梳理。 這裡的介紹主要是基於php語...