要了解cookie, 先要從HTTP協議提及. 所謂協議, 就要有發起協議的人, 遵照協議的人, 具體來講, 通常就是服務端和客戶端, 雙方遵守HTTP協議的內容.php
HTTP協議有如下特色:瀏覽器
1, 支持客戶/服務器模式;服務器
2, 簡單快速: 不管是客戶端請求仍是服務端響應,設置好對應的消息頭,方法,消息體,就可以傳達給對方,而且雙都能理解對方的意思。cookie
3, 靈活: HTTP容許傳輸任意類型的數據對象。傳輸的類型由Content-Type加以標記便可。session
4, 無鏈接: 客戶端請求服務端,服務端響應完成以後就自動斷開鏈接本次連接。函數
5, 無狀態: 客戶端請求服務端,服務端響應完成以後不會記錄任何本次鏈接通訊的數據。網站
固然,HTTP協議遠遠不止這麼多,具體的咱們後期再說,有了上面的HTTP協議的知識,咱們就要引出咱們的cookie了。url
上面提到,因爲HTTP的無狀態特色, 服務端響應完客戶端的請求以後, 不記錄任何本次鏈接的通訊數據, 這樣就形成一個問題, 就是服務端"記不住"客戶端的請求, 產生"你是誰"的問題. 就比如大樓裏的保安大叔, 每一個進入大樓的人都要登記身份, 並且這位保安大叔還記不住人, 致使每一個人每次進入大樓都要作一次身份校驗, 這樣就很費時間,耗費人力了.spa
那怎麼解決這個問題呢? 這裏就用到了cookie. 就是服務端在響應完客戶端請求的時候, 在返回數據的時候, 給客戶端一段數據, 下次客戶端請求的時候, 帶上這段數據, 這樣服務端就知道是"哪一個"客戶端在請求了. 就比如保安大叔給了你一個小紙條, 上面寫着每一個人的編號, 下次進入大樓, 只要把小紙條給保安大叔看一下, 他認識上面的字, 就知道你以前來過, 確認了你的身份, 就直接放行了, 免除了再次登記和校驗的過程.對象
OK, 這樣一圈下來, 咱們知道, cookie就是服務端返回給客戶端的一小段數據, 這段數據記錄這本次請求的一些信息, 最主要的, 就是一些身份信息. 這樣在下次請求的時候帶上, 服務端就知道你上一次請求的狀態和相關信息, 讓請求有了狀態, 有了記憶.
不少人在存儲一些數據的時候不推薦使用cookie,緣由在於每次客戶端請求服務端的時候,都會帶上cookie信息,cookie雖然一般一個value值只有4K大小,可是量一旦上來就會很費帶寬。
cookie主要是經過報頭HTTPHeader來傳遞數據。也就是在請求頭和消息頭裏面傳遞數據。Cookie機制定義了兩種報頭:Set-Cookie報頭和Cookie報頭。set-cookie存在於服務器響應的消息頭中。而cookie則存在於客戶端請求的消息頭中。
cookie的運行流程以下:
1, 客戶端在瀏覽器的地址欄中鍵入Web服務器的URL,瀏覽器發送讀取網頁的請求。
2, 服務器接收到請求後,產生一個Set-Cookie報頭,放在HTTP報文中一塊兒回傳客戶端,發起一次會話。
3, 客戶端收到應答後,若要繼續該次會話,則將Set-Cook-ie中的內容取出,造成一個Cookie.txt文件儲存在客戶端計算機裏。
4, 當客戶端再次向服務器發出請求時,瀏覽器先在電腦裏尋找對應該網站的Cookie.txt文件。若是找到,則根據此Cookie.txt產生Cookie報頭,放在HTTP請求報文中發給服務器。
5, 服務器接收到包含Cookie報頭的請求,檢索其Cookie中與用戶有關的信息,生成一個客戶端所請示的頁面應答傳遞給客戶端。 瀏覽器的每一次網頁請求,均可以傳遞已存在的Cookie文件,例如,瀏覽器的打開或刷新網頁操做。
1, setCookie函數的調用
2, session_start函數的調用
這裏稍微解釋下session_start作的工做,session_start()一旦寫上,服務器端就會在服務器上生成一個session_id,並同時向客戶端發送set-cookie報頭,內容爲phpsessid=session_id, 客戶端接到響應就會生成cookie文件,也就是session_start裏面其實包含了setCookie的操做,只是沒有setCookie那麼靈活而已。
主要包括:Name名字,Value值,Domain域, Path路徑, Expires/Max-Age過時時間, Size數據大小等等。
Name-Value相似於Key-Value的鍵值對,在請求的時候選擇性地帶過去就能夠。
Domain域,就是這個鍵值對,在哪一個域名下有效,能夠被使用。其中.baidu.com表示以baidu.com結尾的全部域名,還能夠指定其餘子域,如map.baidu.com等。
Path路徑,就是跟在域名後面的URL路徑,好比/或者/map等等,路徑與域合在一塊兒就構成了cookie的做用範圍。表示這個鍵值對,在請求哪些url路徑或者其對應的服務器文件的時候,能夠被使用。好比,/表示該域名下的全部url均可以使用這個鍵值對,/search表示該域名/serach下的url纔可使用該鍵值對。