文章目錄
1、cookie介紹
-
HTTP協議是無狀態的協議。一旦數據交換完畢,客戶端與服務器端的連接就會關閉,再次交換數據需要建立新的連接,這就意味着服務器無法從連接上跟蹤會話。也就是說即使第一次和服務器連接後並且登錄成功後,第二次請求服務器依然不能知道當前請求是哪個用戶。舉個例子:用戶A購買了一件商品放入購物車內,當再次購買商品時,服務器已經無法判斷該購買行爲是屬於用戶A的會話,還是用戶B的會話了。要跟蹤該會話,必須引入一種機制。
什麼是一次會話:
用戶打開瀏覽器訪問某個網站, 在這個網站上瀏覽任意頁面, 訪問完成後將瀏覽器關閉的過程稱爲是一次會話。
-
cookie的出現就是爲了解決這個問題,第一次登錄後服務器後,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個cookie,瀏覽器會把cookie數據保存在本地。該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器檢查該cookie存儲name,value等信息,以此來辨認用戶狀態,服務器還可以根據需要修改cookie的內容。
-
cookie就相當於是服務器給客戶端們頒發一個通行證,每人一個,無論誰訪問都必須攜帶自己通行證。這樣服務器就能從通行證上確認客戶身份,這就是Cookie的工作原理。
-
cookie存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB,因此使用cookie只能存儲一些小量的數據。
-
cookie的出現彌補HTTP協議無狀態的不足。但是cookie是存儲在客戶端的,通過瀏覽器或者抓包工具很容易就能獲取到,所以非常不安全。
2、session介紹
-
session是另一種記錄客戶狀態的機制,不同的是cookie保存在客戶端瀏覽器中,而session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。存儲在服務器的數據會更加的安全,不容易被竊取。客戶端瀏覽器再次訪問時,只需要從該session中查找該客戶的狀態就可以了。
-
如果說cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼session機制就是通過檢查服務器上的“客戶明細表”來確認客戶身份。Session相當於程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。
-
session存儲在服務器也有一定的弊端,就是會佔用服務器的資源,但現在服務器已經發展至今,存儲一些session信息還是綽綽有餘的。
3、cookie和session工作原理圖解
4、記錄cookie的作用
-
用戶第一次登陸時,勾選下次直接登陸或者記住密碼,就是採用記錄cookie實現的。
-
cookie內記錄用戶名和密碼(加密)信息,只要請求時服務器收到cookie,識別成功,默認爲已登陸。
5、Selenium操作cookie 的方法
webdriver
可以讀取、添加和刪除cookie信息。
webdriver操作cookie 的方法有:
操作 | 說明 |
---|---|
get_cookies() | 獲得所有cookie 信息(重點) |
add_cookie(cookie_dict) | 添加cookie,必須有name 和value 值(重點) |
get_cookie(name值) | 返回指定name名稱的cookie 信息 |
delete_cookie(name) | 刪除特定(部分)的cookie 信息 |
delete_all_cookies() | 刪除所有cookie 信息 |
6、示例:
"""
1.學習目標:
掌握selenium對cookie操作
2.語法
2.1獲取所有cookie
driver.get.cookies()
返同列表格式字典類型 [{},{},{}]
2.2添加cookie
driver.add_cookie(參數)
參數:字典格式{"name":"name值","value":"value值"}
3.需求
實現selenium對cookie操作
"""
# 1.導入selenium
from selenium import webdriver
from time import sleep
# 2.打開瀏覽器
driver = webdriver.Chrome()
# 3.打開註冊A頁面
# 不打開一個頁面,cookie爲[]。
url = "http://www.baidu.com/"
driver.get(url)
# 4.操作cookie
# 4.1 獲取cookie
cookies = driver.get_cookies()
for cookie in cookies:
# 值打印cookie中的name和value
print("%s -> %s" % (cookie['name'], cookie['value']))
print("=======================")
# 4.2 獲取一個cookie的指定屬性值
# 參數是一個cookie中name的屬性值
# 沒有找到返回None
print(driver.get_cookie("BAIDUID"))
print("=======================")
# 4.3 添加cookie
cookie = {"name": "key-aaaaaaa", "value": "value-aaaaaaa"}
driver.add_cookie(cookie)
# 添加後再次獲取
cookies = driver.get_cookies()
for cookie in cookies:
print("%s -> %s" % (cookie['name'], cookie['value']))
print("=======================")
# 4.4 刪除指定cookie
# 根據name刪除
driver.delete_cookie("key-aaaaaaa")
# 刪除後再次獲取
cookies = driver.get_cookies()
for cookie in cookies:
print("%s -> %s" % (cookie['name'], cookie['value']))
print("=======================")
# 4.5 刪除全部cookie
driver.delete_all_cookies()
print(driver.get_cookies())
# 5.關閉瀏覽器
sleep(2)
driver.quit()
7、cookie內容參數說明
參數 | 描述 |
---|---|
name | 必需。規定 cookie 的名稱。 |
value | 必需。規定 cookie 的值。 |
expire | 可選。規定 cookie 的有效期。 |
domain | 可選。規定 cookie 的域名。 |
path | 可選。規定 cookie 的服務器路徑。 |
secure | 可選。規定是否通過安全的 HTTPS 連接來傳輸 cookie。 |
httpOnly | 可選。防止XSS攻擊(跨站腳本攻擊) |
說明:
- path:cookie的有效範圍,這個參數domain參數基礎上的有效範圍,如果path設置爲”/”,那就是在整個domain都有效。
- secure:cookie是否僅通過安全的https,值爲0或1。如果值爲1,則cookie只能在https連接上有效,默認值爲0,表示cookei在http和https連接上都有效。(0或1,也可表示Flase或True)
- httpOnly:通過js腳本將無法讀取到cookie信息,這樣能有效的防止XSS攻擊(跨站腳本攻擊),這樣就增加了cookie的安全性,即便是這樣,也不要將重要信息存入cookie。
參考: