首頁  >  文章  >  後端開發  >  PHP版本--HTTP session cookie原理及應用

PHP版本--HTTP session cookie原理及應用

WBOY
WBOY原創
2016-07-30 13:29:551057瀏覽

PHP 的COOKIE

    cookie 是一種在遠端瀏覽器端儲存資料並以此來追蹤和識別使用者的機制。 
    PHP在http 協定的頭資訊裡傳送cookie,因此  setcookie()函數必須在其它資訊被輸出到瀏覽器前調用,這和對header()函數的限制類似。

------------------------------------------ -------------------------------------------------- ----------------------------------

    1.設定cookie:

    a .可以用setcookie()或setrawcookie()函式來設定cookie。也可以透過直接向客戶端發送http頭來設定。

    

Php代碼 PHP版本--HTTP session cookie原理及應用

'something from somewhere'
    ;  
  1. setcookie( "TestCookie"$value
  2. ); 
  3. /* 簡單 cookie設定 */  $value, time( )+3600); /* 有效期限 1小時 */   
  4. setcookie( time()+3600, "/ ~rasmus/",  ".example.com", 1); 🠎    
  5.     設定多個cookie  變數:setcookie('var[a]','value');這樣就可以用$_COOKIE[‘var’][‘a’]來讀取該COOKIE 變數。      b. 使用header()設定cookie;
  6. :$ 但 .com[ ;...]]");     eg:
Php 

Php 'something from somewhere'

;   

header(

"Set-Cookie:name=$value"

);  

-------------------------------------------------- -------------------------------------------------- -------------

    2.讀取cookie:PHP版本--HTTP session cookie原理及應用

    直接使用php  內建超級變數$_COOKIE 就可以讀取瀏覽器端的cookie。 
  1.     上述範例設定了cookie "TestCookie",現在我們來讀:  
    1. print $_COOKIE['TestCookie'];  ---------------- -------------------------------------------------- -------------------------------------------------- --------

        3.刪除cookie

         只要將有效時間設定為小於當前時間,且將有效時間設定為小於目前時間。例如:     eg:

    Php代碼 

    ookie

    PHP版本--HTTP session cookie原理及應用""

    , time()-1);  
    1.      以header()類似。       note:
         a.

    setcookiep(3)時有錯誤提示,也可能你的文件是從其他字符集轉  換過來,文件後面可能帶有 BOM 簽章(就是在文件內容中加入一些隱藏的BOM 字元)。解決的辦法就是使你的文件不出現這種情況。還有透過使用ob_start()函數 也能處理一點。

         b.$_COOKIE 受magic_quotes_gpc 影響,可能自動轉義

    - -------------------------------------------------- -------------------------------------------------- -------------------------

         4.原理.

         a.伺服器透過隨著回應傳送一個http 的Set-Cookie 頭,在客戶機中設定一個cookie(多個cookie 要多個頭)。 

         b.並在客戶端自動傳送一個http 的cookie 頭,伺服器接收讀取。           HTTP/1.x 200 OK           X-Powered-By: PHP/           Expires: Thu, 19 Nov 2007 18:52:00 GMT           Cache -Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0           Pragma: no-cache 

     一行實作了cookie 功能,收到這行後

        Set-Cookie: TestCookie=something from somewhere; path=/ 

        瀏覽器將在客戶端的磁碟上建立一個cookie,並在內部寫入: from somewhere;     這一行就是我們用setcookie('TestCookie','something   from  somewhere','/'); 的結果。也就是用     header('Set-Cookie: TestCookie=something from somewhere; path=/');的結果。

     





    ---------------------------------------- ---------分線------------------------------------------------- -----------------------------

     


    PHP 的SESSION

    PHP 的SESSION

    PHP 的SESSION

    session 使用過期時間設為0 的cookie,並且將一個稱為session ID 的唯一識別碼(一長串字串),在伺服器端同步產生一些 session 檔案(可以自己定義 session 的保存類型),與用戶機關聯起來。 web應用程式存貯與這些 session 相關的數據,並且讓數據隨著用戶在頁面之間傳遞.訪問網站的來客會被分配一個唯一的標識符,即所謂的 SESSION ID。它要麼存放在客戶端的cookie,要麼經由  URL  傳遞.SESSION 允許使用者註冊任意數目的變數並保留給各個請求使用。當來客造訪網站時,PHP會自動(如果session.auto_start 被設為1)或在使用者要求時(由session_start()明確呼叫或session_register() 暗中呼叫)檢查請求中是否傳送了特定的SESSION ID。如果是,則先前儲存的環境就被重建。

    session最最核心的概念就是:網頁間跳轉的額外數據,保存在伺服器,用一個id標識,瀏覽器要維持session,需要每次提交都帶上這個id.

    --------------------------------------------- -------------------------------------------------- -------------------------------

    session id的傳遞有兩種方式:

    a. 透過cookie 傳送SESSION ID

    使用session_start()呼叫session,伺服器端在產生session 檔案的同時,產生session ID 哈希值和預設值為PHPSESSID 的session name,並向客戶端發送變數為(預設的是)PHPSESSID(session name),值為一個 128 位元的哈希值。伺服器端將透過該 cookie 與客戶端進行互動。 session 變數的值經php內部序列化後保存在伺服器機器上的文字檔案中,和客戶端的變數名稱預設為PHPSESSID 的coolie 進行對應互動.即伺服器自動傳送了http  頭:header('Set-Cookie :  session_name()=session_id();  path=/'); 即setcookie(session_name(),session_id()); 
    當從該頁跳到的新頁面並呼叫session_start()後,PHP 將檢查與給定ID 相關聯的伺服器端存貯的session 數據,如果沒找到,就新建一個數據集。

    b.透過URL傳送session ID

    只有在使用者中可禁止使用通用cookie 的時候
    只有在使用者可以禁止使用通用cookie 的時候

    ,因為瀏覽器該方法。 

        xxx,也可以透過POST 傳遞 session 值。

    ------------------------------------------ -------------------------------------------------- ----------------------------------


    如果客戶端禁止使用cookie,可以使用如下方法:

    a、設定php.ini中的session.use_trans_sid = 1或編譯時開啟開啟了--enable-trans-sid選項,讓PHP自動跨頁傳遞session id。 b、手動透過URL傳值、隱藏表單傳遞session id。 c、以檔案、資料庫等形式保存session_id,在跨頁過程中手動呼叫。

    link:http://apps.hi.baidu.com/share/detail/41643457


     

    session也可以在禁用cookiesion. =1,改為0,session會保存在伺服器端,而不是客戶端的cookie。

    可以透過session.save_path來查看伺服器的session存放位置

    session的使用:

    eg:com

    1. // page1.php   
    2.     echo
    3.  
    4. 'Welcome to page #1';       /* 建立 session變數並給予 session變數值 */
    5.    
    6. $_SESSION['favcolor'
    7. ] = 
    8. 'green' ;   
    9.     $_SESSION🎠     $_SESSION[
    10. 'time '] = time();       // 若客戶端使用    echo 
    11. 'page 2';         
    12. echo
    13.  '
       . SID . 
      '">page 2'; 
      /*
    14.  
    15.     默認php5.2.1下,SID只有在 cookie被寫入的同時才會有值,如果該 session   SID將為 (未定義)空  
    16.     */      
    17.     hp代碼 // page2.php   
    18.     session_start();  
    19.     print 出單 session   
    20.     var_dump($ _SESSION
    21. ); // 印出page1.php傳過來的 session值   

    刪除session:

    PHP版本--HTTP session cookie原理及應用

    1. eg:
    2. Php程式碼  / 第一步: 刪除伺服器端 session檔案,這使用 
    3.    setcookie(session_name(),'',time()-3600);         
    4. $_SESSION  = array();     // 第三步驟: 刪除$_SESSION3
    5.  

       

      -------------------------------------------------- -------------------------------------------------- --一個簡單的範例:

      php code:

      Php 

        PHP版本--HTTP session cookie原理及應用

      1. if (isset($_SESSION[
      2. 'test_sess'
      3.     $_SESSION['test_sess ']++;    
      4.  
      5.     $_SESSION['test_sess' ] = 0;  
      6.   
      7. echo $_SESSION
      8. ['test_sess' ];   
      9. 使用的一個叫做httplook的http包嗅探工具來抓包
      10. 第一次請求伺服器:
      11. GET /test.php HTTP/1.1 Accept: */* Referer: http: User-Agent : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322) Host: localConnection 伺服器第一次回:

      HTTP/1.1 200 OK Date: Fri, 26 2) SVN/1.2.1 PHP/ 5.0.4 DAV/2 X-Powered-By: PHP/5.0.4 

      Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/ 

      3mfc94ncdr15ujitjogma3; path Cache-Control: no -store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 1 Keep-Alive:ConnectionConnectionout=195, -Alive 

      Content-Type: text/html; charset=utf-8 

      Content-Language: Off

       次請求 



      GET /test.php HTTP/1.1 
      Accept: */* 
      Referer: http://localhost/ 
      Accept-Language: zh-cn Accept-Ancom:7):comm/Sdefilla/defillar.com MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322) 
      Host: localhost 
      ): Keep-Alive 
      Cookie:530mfcm>

       

      伺服器第二次回:

      HTTP/1.1 200 OK 
      Date: Fri, 26 Aug 2005 07:44:23 GMT Server: AV/2 
      X- Powered-By: PHP/5.0.4 
      Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/ 
      Expires: Thu, 1915ujitjogma3; path=/ 
      Expires: Thu, 1900:Nov 198:0185 cache, must- revalidate, post-check=0, pre-check=0 
      Pragma: no-cache 
      Content-Length: 1 
      Keep-Alive: timeout=15, max=98 
      Keep-Alive: timeout=15, max=98 
      Keep-Alive: timeout=15, max=98 
      Keep-Alive: timeout=15, max=98 
      html; charset=utf-8 
      Content-Language: Off

       



      這個header會向伺服器發送一個cookie訊息,告訴伺服器我有一個cookie,名字叫PHPSESSID,內容是bmmc3mfc94ncdr15ujitjogma3。 
      這個cookie是怎麼來的呢?看第一次伺服器回傳的訊息裡邊有: 
      Set-Cookie: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; path=/ 
      這是伺服器向客戶端瀏覽器寫一個cookie,名字是PHPSESSID,值是bmmc3mfc94dr15 session_id。
      繼續看第二次向伺服器發出的請求,仍然向伺服器發送了PHPSESSID這個cookie 
      可以得到以下結論: 
      1、只要使用了session,就會透過cookie的方式向客戶端瀏覽器發送session 
      2、每次向伺服器發出請求的時候,本地瀏覽器會把cookie附帶在請求資訊中

       

      總結:

      只要使用了session,只要使用cookiesion,就會透過cookie的方式向客戶端瀏覽器發送session 
      實際上session完全是一個抽象的概念,session真正要做的,是在除了http提供的get和post提供的參數之外,針對某個用戶(可能是個瀏覽器,或是台電腦,甚至是個ip),能保存額外的資訊。如果我們不用系統提供的session,完全也可以傳遞數據,例如把我們原本要存入session的數據,序列化後再加密,形成一個字串,在頁面上所有的url和form裡傳遞。伺服器收到頁面請求後,從get或post裡取出機密串,揭開,還原數據,實際上和session要做的東西一個樣。只不過這種方式超級bt,要實現需要做太多額外的工作。
      session從技術角度講,就是把在網頁連結之間,額外要儲存的數據,用一個id命名,保存在伺服器端,而瀏覽器只需要每次get或post的適合,只提供這個id,就能獲得之前儲存的資料。 php預設是用檔案來保存資料的。 unix下,php通常會在/tmp下面,建立 "sess_"+$session_id 這樣的檔名,透過這個名字,就能直接找到session_id對應的資料。 所以session最最核心的概念就是:網頁間跳轉的額外數據,保存在伺服器,用一個id標識,瀏覽器要維持session,需要每次提交都帶上這個id。 
      怎麼能讓瀏覽器每次請求都能帶上這個id呢,笨辦法當然是在每個url連結或form的post裡都加個id的參數,有些webmail其實就是這麼做的。當然更簡單的辦法就是透過cookie來儲存。但cookie方案還有個問題,如果瀏覽器不支援cookie怎麼辦,上面也有陳述.
      上述的session,是php4,5提供的session功能,要知道php4之前系統都沒有提供session功能!而且很多cgi程序,都是完全自己實現的session。 php(4,5)提供的session,系統預設會用cookie來保存session_id 
      我之前一個項目,使用者都在內網使用web。為了方便管理,直接把瀏覽器ip綁死到一個session,就是用瀏覽器ip位址取代了sessionid。這個方案裡沒有cookie,但還算是session,應為他沒脫出session的定義。

       

      每次向伺服器發出請求的時候,本地瀏覽器會把cookie附帶在請求訊息中 
      實際上和session完全沒有關係,說的只是http協議裡cookie的工作方式。這個cookie是session_start()函數寫的,我們也完全可以自己任意寫cookie,只要寫了,而且沒超過有效期,瀏覽器都能送。

      以上就介紹了PHP版本--HTTP session cookie原理及應用,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:php數組操作下一篇:php數組操作