Django 中的 cookie 和 session
由於HTTP協議是無狀態的,而服務器端的業務必須是要有狀態的。Cookie誕生的最初目的是為了存儲web中的狀態信息,以方便服務器端使用。比如判斷用戶是否是第一次訪問網站。目前最新的規範是RFC 6265,它是一個由瀏覽器服務器共同協作實現的規範。
Cookie的處理分為:
服務器像客戶端發送cookie
瀏覽器將cookie保存
之後每次http請求瀏覽器都會將cookie發送給服務器端
簡單的來說,cookie就是服務端給瀏覽器的一些鍵值對(key - value)
瀏覽器會按照規則保存下 cookie,並在後面的請求中把這些 key-value一並發送給服務端
服務端拿到辨別是誰給我發的請求,是否經過認證之類
Django中設置cookie:
?
from django.shortcuts import render, HttpResponse, redirect
?
#創建一個要返回給前端的對象
response = HttpResponse("<center>404 你錯了!</center>")
?
#基於response 來設置 cookie
response.set_cookie(key="name", value="zhanSan") #這樣一個帶默認約束的cookie就設置好了
#設置一個帶超時時間的cookie 參數 max_age (expire) 表示多少秒後過期
response.set_cookie("email", "[email protected]", max_age=60)
?
#設置一個加密(加鹽)的cookie
response.set_signed_cookie("uid", 17, salt="for_uid")
?
#大功告成,直接給客戶端返回就行
return responseDjango 在 request 對象中封裝了所有來自客戶端的數據,
所以:我們獲取cookie就是基於request對象來操作
request.COOKIES.get("name", None)
?
#獲取那個加了鹽的 key = uid 的值,需要根據加的鹽反解
request.get_signed_cookie("uid", salt="for_uid")
?這兒的cookies 都是以字典形式在維護的,所以不建議通過request.COOKIES["name"]去取,
當key不存在時就報錯了
?
rep = HttpResponse(...) 或 rep = render(request, ...)
rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽',...)
參數:
key, 鍵
value='', 值
max_age=None, 超時時間
expires=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獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
?
二、session
session與cookie區別:
cookie保存在客戶端,session保存在服務端
cookie的保存形式為key-value, session的保存形式為 key : {k1: v1, k2:v2, k3: v3}
session的第一個key為服務端生成的字符串,會以cookie的形式發送給客戶端
默認發送(瀏覽器保存)形式為:sessionid="隨機字符串"
服務器的保存形式為:"隨機字符串": {k1:v1, k2: v2, k3:v3}Django 中的session也是維護在 request參數中的,COOKIES也是
Django在生成session非常的方便,默認自動給你生成、維護 session的識別(隨機字符串)
不需要你去手動生成維護這個字符串及對應的字典。只需要去設置需要存儲的值就行了
生成並設置session:
request.session[‘user‘] = "zhangSan"
request.session[‘email‘] = "[email protected]"
request.session[‘pwd‘] = "xxxxxxxx"設置session超時時間:
request.session.set_expiry(60) #超時時間設置為60秒退出時清除設置的session:
request.session.clear()
因為sesson內部是一個字典,所以字典的方法都可以使用
# 所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
一些常用的session方法:
# 用戶session的隨機字符串
request.session.session_key
?
# 將所有Session失效日期小於當前日期的數據刪除
request.session.clear_expired()
?
# 檢查 用戶session的隨機字符串 在數據庫中是否
request.session.exists("session_key")
?
# 刪除當前用戶的所有Session數據
request.session.delete("session_key")
?
request.session.delete(request.session.session_key)
?
request.session.set_expiry(value)
* value整數,session在value秒後失效。
* value是datatime或timedelta,session會在設定時間後失效。
* value=0,用戶關閉瀏覽器session就會失效。
* value是None,session會依賴全局session失效策略。
?
2.3 配置session全局設置
- 項目木同名的settings.py下:
存儲引擎:
# cache中:
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_ALIAS = "db2" #別名緩存位置,指定存儲庫。默認內存緩存,也可以是memcache
#數據庫中
SESSION_ENGINE = "django.contrib.sessions.backends.db"
#文件中:
SESSION_ENGINE = "django.contrib.sessions.backends.file"
SESSION_FILE_PATH = None #文件路徑
#緩存加DB
SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘常用設置:
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑,‘/‘ 為項目根目錄
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之後才保存
獲取項目所有cookie
document.cookie
document.cookie
"__gads=ID=3694xxxa751ed:T=1511442057:S=ALNI_MZTRxxxxNqKryxxxxZu7kjFQ; _ga=GA1.2.1165121507991355; __utma=226521935.11149926.15015647545.1531209676.1531270605.3; __utmz=2265156451270605.3.2.utmcsr=zzk.cnblogs.c587445ccn=(referral)|utmcmd=referral|sdfecct=/s/blogpost; AlwaysCresdfesAsActive=True; AdminCoosfesdfsExpandAdvanced=True; SERVERID=a15b3bd10716efwefsdfbb89e87a05|1536885192|1535456884623"
可以看見全部存在一個字符串中了:那想匹配誰就用正則策略去匹配吧!
都是 key=value; 然後以分號結尾
var cookie_str = document.cookie
var pattern = /你要匹配的key=([.|_a-zA-Z0-9]+:) \b/
pattern.exec(cookie_str)
3.2 給cookie設置超時時間
匹配部分我使用的jquery.cookie.js插件,你也可以使用原生JavaScript
function expire_session(name, time){
var date_time = new Date();
date_time.setTime(date_time.getTime()+time);
var expires= "expires="+ date_time.toGMTString()+";path=/";
document.cookie = name+"="+$.cookie(name)+';'+expires;
}
Django 中的 cookie 和 session