cookie的存儲
cookie是瀏覽器支持的一種本地存儲方式。以dict,鍵值對方式存儲。
{"sessionkey": "123"}
瀏覽器會自動對於它進行解析。
http請求是一種無狀態的請求
用戶向服務器發起的兩次請求之間是沒有狀態的。也就是服務器並不知道這是同一個用戶發的。
有狀態請求(cookie)
服務器a
發回來的id
會放到服務器a
的域之下。不能跨域訪問cookie。
使用瀏覽器隨便打開一個網頁,然后f12
打開。
比如我使用的Chrome
瀏覽器
會找到存儲在瀏覽器本地的cookie值
點擊clear all
清空所有的cookie
f5
刷新頁面,會發現又把這些cookie值進來。
如果將用戶名和密碼直接保存在cookie,可以實現最垃圾最簡略版本的自動登錄。
解決cookie放在本地不安全的問題(session)
用戶在第一次請求后,瀏覽器回復的id既可以是用戶的user id。
也可以一段任意的字符串,我們把它叫做session id
根據用戶名和密碼,服務器會采用自己的規則生成session id
。這個session id
保存在本地cookie。瀏覽器請求服務器會攜帶。
輸入用戶名 & 密碼 調用 login(), 后端程序會根據用戶名密碼生成session id。保存在數據庫中。 用戶登錄之后,需要通過這個session id取出這些基本信息。
Django的默認表中的session
表就記錄了用戶登錄時,后端我們Django為用戶生成的sessionid
。
可以看到session key value
和過期時間。
我們可以清空這張表的數據。運行項目進行登錄。
此時通過f12
查看瀏覽器在本地存儲的session id
。可以看到如下圖和我們數據庫中的一致。
session_key 發到瀏覽器叫做session id
通過session id 用戶訪問任何一個頁面都會攜帶,服務器就會認識。
Setting.py中,
這個app會攔截我們每次的request請求,在request
中找到session id,然后去數據表中進行查詢。
然后通過session key
去找到session data
。此時直接為我們取出了user。
在服務器返回瀏覽器的response
中也會直接加上session id
cookie是瀏覽器本地存儲機制,存在域名之下,存儲不安全。
服務器在返回id時通過規則生成一串字符,並設置了過期時間。存儲在服務器端(數據庫)