cookie和會話狀態的工作原理


一:存在兩種類型的cookie:

1>會話cookie (session cookie)
       不設置過期時間,則表示這個cookie生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口,   cookie就消失了。
       生命期為瀏覽器會話期。
       一般不保存在硬盤上而是保存在內存里。
2>持久性cookie (persistent cookies)
       設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie依然有效直到超過設定的過期時間。
       保存在用戶硬盤上面,同一瀏覽器可以獲取。

二: session相關知識

2.1: 什么是session?
       Session 是一種保存上下文信息的機制,它是針對每一個用戶的,變量的值保存在服務器端,通過sessionid來區分不同的客戶,session是以cookie或url重       寫為基礎.
2.2: session  的工作原理
client———>1.request————————->server
                       2. session_start();
   |<————-3.reponse(SESSION_ID)<——–|
   |————->4.request(SESSION_ID)———>|
                       5. session_start();
   |<————-6.reponse(SESSION_ID)<———|
   |————->7. request(SESSION_ID + logout)–>|
                      8. session_destroy();
   |<————-9. reponse(刪除cookie文件)<——-|
 
 
  1. client打開網頁,向server發出請求,client上由於沒有相應的cookie文件存在,在請求中不輸送SESSION_ID
  2. 服務器在接受到client的請求后,通過執行session_start()函數開始進行session的處理, 首先確認請求中有沒有SESSION_ID,如果沒有的話,發行一個新的SESSION_ID;如果有的話, 則調用那個存有SESSION_ID的文件,並把信息寫入$_SESSION里去,並存入以sess_開頭的文件里。
  3. 把寫入信息的$_SESSION參數發回給client,client在GET服務器發來的信息后,把這些信息保存在cookie里。
  4. client把cookie里的SESSION_ID一起寫入header后再次向server發出請求。重復1-3的操作
  5. client發出登出請求
  6. 服務器接受請求后,通過執行session_destroy()函數開始刪除session文件處理
  7. 服務器向client發出刪除保存在client上的cookie文件的命令:   setcookie(session_name(), ”, time()-60, ‘/’);
 
2.3: 注意
  1.     通常情況下是不能跨窗口使用,但用sessionid保存在持久cookie中,然后在從新窗口中讀取,就可以得到sessionid,實現跨窗口的使用.
  2.     在大瀏覽量的網站,session並不保險,可能會出現重復的sessionid.
  3.     Session ID不能從硬盤上的Cookie文件獲得,如果想在客戶端獲知自己的Session ID,只能通過Javascrīpt來讀取。
 
2.4 php使用及設置
        Session_start() :開始一個會話或者返回已經存在的會話。在使用Session_start()之前瀏覽器不能有任何輸出,否則會發生以下錯誤。你可以在php.ini里   啟動session.auto_start=1,這樣就無需每次使用session之前都要調用session_start()。
如果在session.auto_start=1,會讓session_save_path (‘./t/’);變的無效。因為后一條語句須放前面。
 
2.5 增加PHP的Session存儲和處理能力
      ;session.save_path = “N;MODE;/path”  這項設置提供給我們可以給session存放目錄進行多級散列,其中“N”表示要設置的目錄級數,
      “MODE”表示目錄的權限屬性,默認為600
 
  2.6:多服務器共享php的SESSION
    1、NFS或者Samba共享的方法,讓各個服務器上存放session文件的磁盤共享,這種方法簡單可行。
    2、集中存儲到數據庫中,這是比較多的實現方法,通過php提供的session_set_save_handler()函數來重定義session函數,推薦使用這種方法。
 

三: cookie知識

     什么是 Cookie?其工作原理如何?Cookie 是一小段文本信息,伴隨着用戶請求和頁面在 Web 服務器和瀏覽器之間傳遞。用戶每次訪問站點時,Web 應用程序都可以讀取 Cookie 包含的信息。 Cookie 的基本工作原理如果用戶再次訪問站點上的頁面,當該用戶輸入 URLwww.*****.com時,瀏覽器就會在本地硬盤上查找與該 URL 相關聯的 Cookie。如果該 Cookie 存在,瀏覽器就將它與頁面請求一起發送到您的站點。Cookie 有哪些用途?最根本的用途是:Cookie 能夠幫助 Web 站點保存有關訪問者的信息。更概括地說,Cookie 是一種保持Web 應用程序連續性(即執行“狀態管理”)的方法.使 Web 站點記住您.
1、客戶端執行程序請求 服務器發回請求結果 並且生成一個cookie給客戶端 所以 第二次刷新的時候 才會有cookie的出現
2、session是保存在內存中,跟進程是同時存在的會話cookie,但是此時服務器端還保存有session文件 需要設置時間來刪除session文件
3、Cookie是在本地Cookie文件中保存一些信息,Cookie文件中保存的是鍵值對(key-value)。Cookie文件存放於你本地計算機系統盤的Document   and   Settings/用戶名   目錄下。如果你訪問的網站的名稱為www.abc.com,那么一般來說,Cookie文件的名稱為   用戶名@abc.com,你可以自己打開文件夾看一看。你提到的getName獲得的是保存在Cookie文件中某一個Cookie的key值。

我們知道,session是在服務器端保持用戶會話數據的一種方法,對應的cookie是在客戶端保持用戶數據。HTTP協議是一種無狀態協議,服務器響應完之后就失去了與瀏覽器的聯系,最早,Netscape將cookie引入瀏覽器,使得數據可以客戶端跨頁面交換,那么服務器是如何記住眾多用戶的會話數據呢?
首先要將客戶端和服務器端建立一一聯系,每個客戶端都得有一個唯一標識,這樣服務器才能識別出來。建議唯一標識的方法有兩種:cookie或者通過GET方式指定。默認配置的PHP使用session的時會建立一個名叫”PHPSESSID”的cookie(可以通過php.ini修改session.name值指定),如果客戶端禁用cookie,你也可以指定通過GET方式把session id傳到服務器(修改php.ini中session.use_trans_sid等參數)。
我們查看服務器端session.save_path目錄會發現很多類似sess_vv9lpgf0nmkurgvkba1vbvj915這樣的文件,這個其實就是session id “vv9lpgf0nmkurgvkba1vbvj915〃對應的數據。真相就在這里,客戶端將session id傳遞到服務器,服務器根據session id找到對應的文件,讀取的時候對文件內容進行反序列化就得到session的值,保存的時候先序列化再寫入。


免責聲明!

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



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