session理解

session理解

仍是那句。。。。新手上路。。大神歡迎指點數據庫

1.session的概念

其實什麼是session?什麼是cookie?這些都是些老掉牙的問題了。。而作過相關的開發的人,基本都知道。。而還不是很理解的,谷歌下,要理解這兩個東西其實也不難。。那這裏我就不去探討這個問題了。。瀏覽器

2.cookie與session的關係

說下個人理解吧:緩存

cookie和session的方案雖然分別屬於客戶端和服務端,可是服務端的session的實現對客戶端的cookie有依賴關係的;步驟大概以下:服務器

  • 服務端執行Session機制
  • 生成對應而惟一的session_id(經過對這個session_id的解析和處理,服務端能夠找到,該session保存的文件;再從文件中提取出session的信息)
  • 服務端會將這個session_id發送給客戶端
  • 客戶端接受到session_id,以cookie做爲保存的容器保存起來
  • 客戶端在每次請求的時候都會帶這個session_id給服務端
  • 服務端自行解析session

注意:session保存信息的手段是多種的:緩存,數據庫,文件等;可是默認是文件形式保存。。。cookie

問題:session

  1. 禁用了cookie後,session還能使用嗎?
  2. app就真的不可使用session嗎?

爲了探討上面的問題。。咱們先看看 session 建立和銷燬的時機。。app

3.建立 session和銷燬session的時機

  1. 建立session的時候會附帶着建立一個cookie,它的MaxAge爲-1,也就是說只能存在於內存中。當瀏覽器端禁用cookie時,這個cookie依然會被建立。
  2. 當瀏覽器提交的請求中有jsessionid參數或cookie報頭時,容器再也不新建session,而只是找到先前的session進行關聯。這裏又分爲兩種狀況:

    1)使用jsessionid。該值若能與現有的session對應,就不建立新的session,不然,仍然建立新的session。code

    2)使用cookie。該值若能與現有的session對應,也不建立新的session;但若沒有session與之對應(就如上面的重啓服務器以後)容器會根據cookie信息恢復這個與之對應的session,就好像是之前有過同樣。對象

  3. session什麼時候被銷燬?
    當咱們關閉瀏覽器,再打開它,鏈接服務器時,服務器端會分配一個新的session,也就是說會啓動一個新的會話。那麼原來的session是否是被銷燬了呢?我作了個小實驗:

建立一個session:內存

//啓動session的初始化
session_start();
//註冊session變量,而且賦值
$_SESSION["username"] = "hello"
//輸出生成的session_id
echo session_id();

訪問頁面建立session,獲取session_id,關閉瀏覽器;

根據session_id建立session對象

//上面輸出的session_id
$session_id = "qpk6onnn3husvotnke030ftcm4";
session_id($session_id);
session_start();
echo $_SESSION["username"];

結果能夠取出 "hello"

由此能夠看出:

當瀏覽器關閉時,原session並無被銷燬(destory方法沒有執行),而是等到timeout到期,才銷燬這個session。關閉瀏覽器只是在客戶端的內存中清除了與原會話相關的cookie,再次打開瀏覽器進行鏈接時,瀏覽器沒法發送cookie信息,因此服務器會認爲是一個新的會話。所以,若是有某些與session關聯的資源想在關閉瀏覽器時就進行清理(如臨時文件等),那麼應該發送特定的請求到服務器端,而不是等到session的自動清理。

4.迴歸問題。。

其實個人理解很簡單(不對的地方歡迎指出)。。

只要有session_id就能夠找到session。。。

cookie 是保存惟一識別(session_id)的手段;

禁用cookie 或者 原本就不支持cookie,可是經過其餘手段,也能實現cookie實現的功能。服務器只要有session_id;仍是能找到對應的session的;只是session機制,內部原本是經過cookie自動實現的。。。若是不採起cookie的話,就要本身去邏輯實現。。。感受有點變味了,可是豬肉變質了,仍是豬肉啊。。。具體看本身怎麼看。。。

相關文章
相關標籤/搜索