session和cookie實用手記

由來php

瀏覽器和服務器間的數據交互,就是會話。
    
    可是呢,http協議是無狀態無記憶的,就會致使業務的不連續性。
    [不連續性的說明]譬如你在xxx網站A界面登陸成功,當你點擊跳轉到B界面時,又會提示請登陸。
    
    那麼,怎麼才能讓服務器識別瀏覽器身份,認爲是同一用戶的屢次請求,從而達到數據共享呢?
    
    這就要用到[會話技術]了,本質上就是數據持久化存儲。
    
    會話技術,就是來解決http協議缺陷而致使的業務不連續問題。
    相關補充:cookie在瀏覽器端的存儲,是有數據量限制的,通常是4k;
    而前端本地存儲技術可彌補,譬如:
    localStorage  (20M)   本地存儲    只要用戶不手動刪除,就一直存在   應用場景:記住皮膚;瀏覽歷史搜索;回到上一次離開的位置等
    sessionStorage (5M) 會話存儲    瀏覽器關閉就沒了                應用場景: 單頁面應用間數據的傳遞
    可能存儲在瀏覽器或硬盤上。
    
    會話技術,從保存位置上有所區分:
    持久化存儲在服務端,是session
    持久化存儲在客戶端,是cookie

cookie過程分析前端

瀏覽器請求XXX網站服務器後,服務器把數據存儲在瀏覽器的cookie中;
   後來的每次請求,瀏覽器都會攜帶該網站內全部的cookie做爲身份,由服務端腳原本識別處理。
   固然,這一過程是基於瀏覽器執行的。同一網站在不一樣的瀏覽器間存儲的cookie是不能共享的。

   cookie默認是會話週期,即從瀏覽器打開,請求服務器資源,到關閉瀏覽器這一過程。
   cookie因存儲在客戶端而有安全性的問題,且每次請求都會攜帶全部的cookie內容。

使用算法

/*cookie*/
    //存儲的數據類型,通常是字符串

    //格式說明(未展現全部參數,有興趣的可查手冊)
    setcookie('數據名','數據值','有效期','有效路徑','有效域名');    
    // 特例:
    // PHP_INT_MAX    永久有效
    // /              默認是當前目錄及子目錄有效,我這裏改爲了整站有效
    // .6758591.com   默認是當前域名,我這裏改爲了跨子域
    setcookie('age',18,PHP_INT_MAX,'/','.6758591.com');
    
    // 增
    setcookie('name','Lin');
    // 刪
    setcookie('name','',0);
    setcookie('name','',time()-1);
    // 改
    setcookie('name','Bin');
    // 查
    echo $_COOKIE['name'];

查看(方式不少,擇其一)windows

clipboard.png

session過程分析瀏覽器

瀏覽器,首次請求xxx網站服務器後,服務端因session_start()而當即建立新的session文件;
    
    文件名默認格式,示例: sess_0l4jphu0c88lm1ka6242po5763    sess_是前綴,後面的字符串是特殊算法生成的具備「惟一隨機性」的串兒;
    
    後經過http協議的響應頭,setcookie去回傳PHPSESSID=0l4jphu0c88lm1ka6242po5763;
    
    瀏覽器收到響應內容後,將PHPSESSID做爲身份信息,保存在cookie,默認是會話週期.
    
    後來的每次請求都會,攜帶全部的cookie信息(包括身份信息)提交給服務器腳本;
    
    服務端收到請求後,比對查找是否有對應的session文件;
    
    若是有的話,則讀取到超全局變量$_SESSION中;
    
    不然會新建session文件,以進行$_SESSION操做.
    
    備註:session文件也不是一直存在於服務端的,默認存活時間是24min。
    默認以文件形式存儲,也可存儲在DB中.但讀取操做仍是要消耗服務器資源的。
    由php.ini中可的相關參數決定存活時間、啓動gc的概率、session_name命名及存儲位置等。

使用安全

/*session*/
    //存儲的數據類型,幾乎支持php的全部數據類型

    //當前頁面開啓session會話機制.(只要用到的頁面,就必定要首先開啓.)
    session_start();
    //增/改
    $_SESSION['name'] = 'Lin';
    //刪
    unset($_SESSION['name']);     //刪除單個session數據
    $_SESSION = [];               //刪除所有session數據
    session_destroy();            //連session文件都銷燬了
    // 查
    echo $_SESSION['name'];

查看(windows下本地服務器,且未修改php.ini中相關配置參數時)服務器

clipboard.png

若是禁用了cookie,那麼session如何使用cookie

cookie和session本質上都能以數據持久化存儲的方式解決身份識別問題,那麼cookie被禁掉後,本地就沒有瀏覽器身份信息隨着請求發到服務器了,服務器天然就不能識別,從而不斷的生成新的session文件。這是不可取的。
   解決的關鍵是,要確保對同一個session文件的操做。那麼在sesion_start()前就得指定session_id();
相關文章
相關標籤/搜索