cookie 和 session

Django之session和cookie

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。

設置Cookie

  普通設置,key爲鍵,value爲值,max_age爲後臺控制過時時間。django

ret = HttpResponse('xxoo')
ret.set_cookie(key, value, max_age=5)

設置加密Cookie

  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

獲取普通方式設置的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 爲以前設置的鍵

Session

概念

  保存在服務器上的一組組鍵值對,與Cookie搭配使用。

做用

  Cookie保存在瀏覽器本地,容易非法獲取,不安全;而session是保存在服務器上,數據安全。

  Cookie的長度受到限制,而session是通過加密換算獲得的結果,不受長度限制。

設置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表
相關文章
相關標籤/搜索