Cookie和Session是爲了在無狀態的HTTP協議之上維護會話狀態,使得服務器能夠知道當前是和哪一個客戶在打交道。html
由於HTTP協議是無狀態的,即每次用戶請求到達服務器時,HTTP服務器並不知道這個用戶是誰、是否登陸過等。如今的服務器之因此知道咱們是否已經登陸,是由於服務器在登陸時設置了瀏覽器的Cookie!Session則是藉由Cookie而實現的更高層的服務器與瀏覽器之間的會話。python
Cookie是由客戶端保存的小型文本文件,其內容爲一系列的鍵值對。 Cookie是由HTTP服務器設置的,保存在瀏覽器中, 在用戶訪問其餘頁面時,會在HTTP請求中附上該服務器以前設置的Cookie
cookie的原理: 第一次:瀏覽器向服務端發送第一次請求,服務端接收返回一個html頁面 第二次:接着瀏覽器客戶端進行登陸註冊,將用戶名密碼以post形式傳給服務端-請求 這時服務端與數據庫進行鏈接,數據庫進行判斷--- 若是是正確的,渲染一個頁面並設了一個cookie,此時cookie的val值是一個隨機的字符串 if true: obj=redirect('/xxx/'),obj.set_cookie() 那服務端就給返回來一個cookie值,換句話講的就是一張小紙條(cookie-key:value) 在客戶端就頁面訪問cookie 能夠看到的是一個鍵值對 第三次請求:客戶端就帶着一個cookie請求到服務端(進行其餘的響應)也就是說那這個小紙條進行驗證,若是沒有小紙條,或者就是這個cookie過時了,以login爲例,請從新進行登陸,從新設定一下cookie。 在服務端登記的 (session內容),能夠拿到客戶端的隱私信息,也就是name值---- cookie 的value值: value的隱私信息 【‘name' :'xxx','age':18】 cookie的val值 做爲session的key值
1.瀏覽器向某個URL發起HTTP請求(能夠是任何請求,好比GET一個頁面、POST一個登陸表單等) 2.對應的服務器收到該HTTP請求,並計算應當返回給瀏覽器的HTTP響應。 3.在響應頭加入set-cookie字段,它的值是要設置的Cookie。 UserAgent(瀏覽器就是一種用戶代理)至少應支持300項Cookie, 每項至少應支持到4096字節,每一個域名至少支持20項Cookie 4.瀏覽器收到來自服務器的HTTP響應。 5瀏覽器在響應頭中發現set-cookie字段,就會將該字段的值保存在內存或者硬盤中。 set-cookie字段的值能夠是不少項Cookie,每一項均可以指定過時時間Expires。 默認的過時時間是用戶關閉瀏覽器時。 6.瀏覽器下次給該服務器發送HTTP請求時, 會將服務器設置的Cookie附加在HTTP請求的頭字段Cookie中。 瀏覽器能夠存儲多個域名下的Cookie,但只發送當前請求的域名曾經指定的Cookie, 這個域名也能夠在set-cookie字段中指定。 7.服務器收到這個HTTP請求,發現請求頭中有Cookie字段, 便知道以前就和這個用戶打過交道了。 8.過時的Cookie會被瀏覽器刪除。 服務器經過set-cookie響應頭字段來指示瀏覽器保存Cookie, 瀏覽器經過Cookie請求頭字段來告訴服務器以前的狀態。 Cookie中包含若干個鍵值對,每一個鍵值對能夠設置過時時間。
HTTP協議是無狀態的,每次請求都是無關聯的,沒有辦法保存狀態,因此使用Cookie保存狀態。數據庫
服務器讓瀏覽器保存的Cookie。 瀏覽器有權拒絕保存Cookie,可是當瀏覽器拒絕保存Cookie時,就沒法完成Web登陸。
Cookie長度有限,能保存的數據量有限。Cookie保存在本地,致使數據不安全。
因爲Cookie以字典的形式保存,因此使用操做字典的方式來操做Cookie。
普通設置,key爲鍵,value爲值,max_age爲後臺控制過時時間。django
ret = HttpResponse('xxoo') ret.set_cookie(key, value, max_age=5)
salt爲設置加密用的鹽。瀏覽器
ret = HttpResponse('xxoo') ret.set_signed_cookie(key, max_age=5, salt='xxoo')
Cookie能夠設置多個參數,具體參數關鍵字以下:安全
key | 鍵 |
---|---|
value='' | 值 |
max_age=None | 超時時間 |
ecpires=None | 超時時間(IE requires expires, so set it if hasn't been already.) |
path='/' | Cookie生效的路徑,/表示根路徑,特殊的:根路徑的Cookie能夠被任何url的頁面訪問 |
domain=None | Cookie生效的域名 |
secure=False | HTTPS傳輸協議的使用與否 |
httponly=False | 只能HTTP協議傳輸,沒法被JavaScript獲取(不是絕對,底層抓包能夠獲取到,也能夠被覆蓋) |
獲取普通方式設置的Cookie服務器
方法一:request.COOKIES['is_login'] 方法二:request.COOKIES.get('is_login')
獲取加鹽設置的Cookiecookie
request.get_signed_cookie(key, salt='xxoo', default='') 其默認值爲default
刪除cookiesession
ret.delete_cookie(key) # key 爲以前設置的鍵
保存在服務器上的一組組鍵值對,與Cookie搭配使用。
Cookie保存在瀏覽器本地,容易非法獲取,不安全;而session是保存在服務器上,數據安全。 Cookie的長度受到限制,而session是通過加密換算獲得的結果,不受長度限制。
login: ### 向客戶端回寫一個cookie值 ''' 1. 向客戶端回寫一個 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'} 2. 將客戶的隱私信息保存在了服務端的數據庫中, 也就是session保存在了數據庫中 默認放在django_session表中 {"dsjnalndjskanjdksa" : {"name":'zekai', 'age':12, 'addr':'dsabdsa'}} ''' #### 設置session request.session['name'] = username request.session['age'] = 13 #### 獲取session request.session.get('name') ### 默認session存在數據庫中, django_session表