COOKIE/SESSION 詳解


  cookie 和 session 是web應用中的會話技術,何為會話技術呢? 說白了就是服務器識別用戶跟蹤用戶的一個功能一個模塊,開發中非常重要哦。

  我們都知道web是基於HTTP協議實現請求與響應的,關於HTTP網上一搜一籮筐,無非就是客戶端和服務器之間協定的一種交互格式。但其有一個不理想的特點就是無狀態性,也就是每次請求都是獨立的,服務器不知道你是誰想做什么或者說不讓你做什么(哪怕你用同一個瀏覽器)。這時會話控制就派上了用場,這樣在訪問服務器時由服務器設置一些信息在終端,之后每次請求都會攜帶這些信息,進而實現跟蹤用戶在整個網站的活動,也就實現了數據在多次請求周期的共享。

  cookie介紹

  cookie英文意思是小甜點 我的理解是服務器送給終端的禮物,由終端保存。在終端訪問服務器時 由服務器向終端分配一些臨時數據,在這些數據有效期內訪問服務器 都將攜帶這些數據,由服務器獲取識別 進而做出相應的回應。

  cookie的數據特點

  單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。

  數據類型單一 只能是字符串(不過可以考慮序列化數據),數據存儲在客戶端每次訪問要攜帶所以 會占用一定的帶寬,也不是很安全(不要存儲重要的數據)。

  cookie的使用

  setcookie(name, value, expire, path, domain, secure, httponly);

    name: 保存的變量名

    value: 保存的數據

    expire:過期時間 以秒為單位,默認0 瀏覽器關閉即失效

    path:數據有效路徑 默認當前路徑,向下兼容。、

    domain:有效域名 在什么域名下有效。如果使用二級域名的話使用 .domain.com

    secure:是否安全傳輸 默認否 (https:)為安全傳輸

    httponly:是否只用於http傳輸使用,默認否(終端腳本可以獲取數據)。

    一般情況下只是如下用法

    setcookie('name', 'tom'); //設置

    $_COOKIE['name];     //獲取 使用超全局變量

    setcookie('name', '', time()-1); 或 setcookie('name',''); //刪除

    cookie的使用場景

    比如說 一周內免登錄,未登錄下的我的足跡,瀏覽歷史等。

 

  session介紹

  我們在介紹cookie中說過cookie的特點 存儲在終端 容量小 占帶寬 不安全等特點,當然也有其優點 如存儲一些不重要的數據做一些配合動作也是很實用的,再加上加密和序列化行為那也是十分強大的。有了對比再說session 理解起來就好多了,

  session的數據是存儲在服務器端的,是不是有個疑惑 數據存在服務器那怎么跟蹤用戶 這不白鬧嗎?其實使用session還是離不開cookie的(有一種基於url的實現方式后面講到),

  session的工作原理是這樣的 在服務器開啟session后 終端請求服務器之初就會自動生成一個session_id 的數據保存在終端用於唯一的指向服務器session、數據區的某個會話數據,看清楚哦是唯一的指向。這樣就好比 你去一家超市 店員給你辦了張會員卡,卡上有唯一的編碼 而你的姓名 年齡 喜好 會員級別等數據都存儲在超市的電腦里,這樣實現用戶識別了。由於session是服務器技術 於是乎就有了很大的戰略縱深(個性化設置),

 

  session的使用

  session可操作的數據類型很豐富,4種標量2種復合類型都可以。

  session_start();  //開啟session 不能重復開啟可以用@錯誤過濾

  $_SESSION['name'] = 'tom'; //設置session

  $_SESSION['name'];   //獲取

  unset($_SESSION['name']); //刪除單個數據

  $_SESSION = NULL; 或 session_unset();  //刪除全部session數據

  session_distroy();  //清空物理數據文件 

  setcookie(session_name(), '', time()-1); //刪除cookie中存儲的session_id  

  溫習兩個函數  1.session_name()-設置獲取session_id 的鍵 (SESSID)  

          2.session_id()-設置獲取session_id 的值

    

  基於url的session的實現

  我們知道cookie是客戶端功能 當然客戶可以自由的開啟和關閉,那么引出一個問題,客戶端關閉cookie、后session是不是就失效了,答案是肯定的。那該如何實現用戶跟蹤呢,我們可以為session正常的使用設立第二道防線,那就是利用url、在各個腳本間傳遞session_id的值。具體實現如下。

  1.使用兩個函數 session_name()獲取當前會話的名稱、session_id()獲取和設置當前會話的ID 拼接為請求字符串連接在各個url連接后面。

    如:http://www.baidu.com/index.php?sname=sid

  2.在其他頁面接收這個sid 注冊為當前session_id  

    如:if ( isset( $_GET[session_name()] ) ){

        session_id( $_GET[session_name());    //注冊為當前的session_id

      }

      session_start(); //不要忘記注冊session_id后開啟session 開啟已有會話 否側創建新會話

    

 

  按照這樣操作是不是感覺太繁瑣 哪個頁面頁至少也有幾十上百個鏈接吧,難免會有疏忽。值得高興的是php已經為我們提供了更為簡單的方式,不過原理還是那個原理。具體實現如下、

    1.設置配置項

    開啟session_use_trans_sid = 1 //開啟自動追加session_id

    關閉session.use_only_cookies = 0  //關閉僅使用cookie項

    后系統會在cookie關閉之后自動的為每個鏈接加上session_id 數據(鏈接上會有顯示)。

    2.依然需要在其它頁面進行判斷接收這個session_id 進行注冊。(語法如上不變).

     

  session屬性

  session是基於cookie實現的,session-id 存儲在cookie中,所以 這個session-id的屬性決定了session的屬性。

  配置項中有對應設置  

    session.cookie_life = 0;     //有效期(默認瀏覽器關閉)

    session.cookie_path = '/';  //默認跟路徑

    session.cookie_domain = ; //有效域名

    session.cookie_secure = ; //是否安全傳輸 HTTPS

    session.cookie_httponly = ; //是否只http傳輸

  推薦使用  session_set_cookie_params(expire, path, domain, secure, httponly); 來設置這些屬性

  以上是對於終端session_id屬性的設置 接下來看看服務器端配置

  session_save_path   //session數據存儲路徑

  session_name = PHPSESSID; //保存在cookie中sessionid的鍵

  session_start = 0; //是否自動開啟session

  session_use_trans_sid ;//是否開啟自動傳遞SID 功能

  session_use_only_cookie = 1; //是否只依賴cookie傳遞SID

     

  session.gc_maxlifetime = 1440;  //session數據及文件生存周期 24分鍾后視為垃圾

  session.gc_probability = 1;  

  session.gc_dirisor = 100;     

  //以上兩個配置組合成了session的垃圾回收機制回收的概率,默認100次請求觸發1次垃圾回收。session垃圾回收機制是惰性刪除 過期之后不會馬上刪除而是等待回收概率的觸發。

  session_save_handler = files; // session默認的保存介質 文件

       

  會話的基本使用已經介紹完畢如果有錯誤還請提出 在此表示感謝!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM