總結一下cookie和session
cookie
-
為什么會有cookie
因為http是一種無狀態的協議,它不對之前發生過得請求和響應狀態進行管理。也就是說,無法根據之前的狀態進行本次的請求處理。假設要求登陸認證的web頁本身無法進行狀態的管理(不記錄已登陸的狀態),那么每次跳轉新頁面不是要再次登陸,就是要在每次請求的報文中附加參數來管理登陸狀態。
無狀態協議當然是就有它的優點。由于不必保存狀態,自然可以減少服務器的CPU及內存資源的消耗。從另一個側面來說,也正是因為http協議本身是非常簡單的,所以才會被應用到各種場景中。
保留無狀態協議這個特征的同時又要解決類似的矛盾問題,于是就引入cookie技術。cookie技術通過在請求和響應報文中寫入cookie信息來控制客戶端的狀態。
cookie會根據從服務器端發送的響應報文內的一個叫做set-cookie的首部字段信息,通知客戶端保存cookie。當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入cookie值后發送出去。
服務器端發現客戶端發送過來的cookie后,會去檢查究竟是從哪一個客戶端發送過來的連接請求,然后對比服務器上的記錄,最后得到之前的狀態信息。
-
長連接
在客戶端執行http請求的之前,會通過TCP協議與服務器建立連接,http響應后,TCP連接不銷毀,以便在下一次http請求的時候直接使用連接,保存時間默認是5秒。
cookie語法
setcookie(名字,值,過期時間,有效目錄,子域名);-
設置cookie
cookie保存的類型只有字符串和數字 -
刪除cookie
-
cookie支持下標
Cookie在瀏覽器上沒有數組的概念,只是瀏覽器請求到服務器后,PHP將同名的值轉成數組。 -
臨時性cookie和永久性cookie
1、臨時性cookie:關閉瀏覽器后cookie消失
2、永久性cookie:關閉瀏覽器后cookie不消失,給臨時性cookie添加一個過期時間即可
-
cookie的有效目錄
cookie默認只能在當前目錄和后代目錄中生效
-
cookie支持子域名
不同的子域名是獨立的網站。他們之間默認只能訪問自己的cookie.
默認情況下,cookie變量是區分子域名的。
cookie的缺點
1、安全性低,因為http協議不加密,不驗證報文的完整性,容易被竊聽偽裝篡改。
2、增加了數據請求的負載,大部分瀏覽器隊cookie的限制是4k
3、可控性差,客戶端可以禁用cookie
session(會話)
1、session技術一般基于cooke技術,但也可以通過其他方式實現
2、要使用一個會話,必須顯式的開啟一個會話,默認情況下,會話不會自動開啟
3、要自動啟動會話,在php.ini中找到session.auto_start=0這行,把0改為1,并重啟服務器
4、session可以保存除了資源以外的任何數據類型
5、session_id()獲取會話編號,session_name()獲取會話名稱
6、會話重復開啟會提示性報錯
-
會話的執行過程
1、使用session_start()函數,PHP從session倉庫中加載已經存儲的會話
2、當session第一次啟動時候,服務器給客戶分配一個唯一的會話id保存在cookie中
3、執行PHP的時候,通過會話編號去倉庫中存入或讀取值
4、當PHP執行結束時,沒有被銷毀的session變量被自動保存到服務器的session倉庫中。
session和cookie的區別
相同點
1、都是會話技術,有生命周期
2、都是無狀態性:服務器將請求內容發送到客戶端后,服務器不在記錄客戶端的信息成為無狀態性。不同點
姓名 | Cookie | session |
---|---|---|
存儲地方 | 瀏覽器中 | 服務器端 |
安全性 | 低 | 高 |
數據負載 | 4K | 沒有限制 |
數據類型 | 字符串和數字 | 出了資源類型外 |
可控性 | 低 | 高 |
禁用cookie
1、如果禁用了cookie,基于cookie的所有技術默認都無法使用
2、php可以通過配置文件改變
3、PHP自動在URL地址上,表單中加上會話編號