[TOC] cookie與session cookie介紹 HTTP協議 是無狀態的,每次請求連接都是不保存客戶端狀態的,cookie就是用來保存客戶端狀態的。試想一下,如果每次登錄一個網站,每次跳轉頁面都不會記錄我的信息,都要求重新輸入密碼,是不是很不爽? Cookie具體指的是一段小信息,它是服 ...
目錄
cookie與session
cookie介紹
HTTP協議 是無狀態的,每次請求連接都是不保存客戶端狀態的,cookie就是用來保存客戶端狀態的。試想一下,如果每次登錄一個網站,每次跳轉頁面都不會記錄我的信息,都要求重新輸入密碼,是不是很不爽?
Cookie具體指的是一段小信息,它是伺服器發送出來存儲在瀏覽器上的一組組鍵值對,下次訪問伺服器時瀏覽器會自動攜帶這些鍵值對,以便伺服器提取有用信息。 簡單來說,就是保存在客戶端瀏覽器的鍵值對。
當你登錄一個網站後,服務端會把你的用戶名、密碼等信息發到你的瀏覽器上保存起來,下次再訪問請求的時候,瀏覽器會自動帶上這些cookie,伺服器就會認識。
session介紹
上述的cookie本身保存在客戶端,容易被攔截,不是很安全,所以就有了session。 瀏覽器登錄網站成功後,伺服器會根據某種演算法生成一個隨機字元串,發給瀏覽器,瀏覽器保存在本地。伺服器記錄了隨機字元串與用戶信息的對應關係,之後瀏覽器 再來訪問,就帶著字元串就來了,然後伺服器識別這個字元串比對 對應關係,如果有這個關係,就知道是你來了。
token
session雖然相對安全,數據保存在服務端,一個用戶保存一份,多個用戶保存多份,一旦用戶量非常大,會占用服務端大量的資源,占用伺服器硬碟空間。
所以就有了token,先提前規定好加密演算法。當用戶來的時候,比如說username,就會用加密演算法對username生成一個隨機字元串,然後把username+隨機字元串發送給瀏覽器保存。當這個用戶再來的時候,伺服器會拿到username再去用加密演算法加密,得到的隨機字元串與保存在瀏覽器本地的字元串做比對,判斷是否是合法用戶。
django操作cookie
設置cookie
obj = HttpResponse() # 利用obj對象才可以操作cookie
return obj
obj.set_cookie('k1', 'v1') # 告訴瀏覽器設置鍵值對
設置cookie過期時間:
obj.set_cookie('k1','v1',max_age=3)
obj.set_cookie('k1','v1',expires=3) # expires參數 是為IE瀏覽器準備用的
cookie超時時間是以秒 作為單位的
一些參數:
- 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獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋
獲取cookie
request.COOKIES.get('k1') # 獲取瀏覽器攜帶的cookie值
簡單的測試:
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'cwz' and password =='123':
obj = redirect('/home/')
obj.set_cookie('whoami', 'cwz')
return obj
return render(request, 'login.html')
def home(request):
if request.COOKIES.get('whoami'):
return HttpResponse('只有登錄成功才能到這兒')
return redirect('/login/')
刪除cookie
用delete_cookie
def logout(request):
obj = redirect('/login/')
obj.delete_cookie('whoami')
return obj
基於cookie實現的登錄認證
request.get_full_path() # 獲取用戶輸入的url
request.path_info # 獲取用戶輸入的url
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'cwz' and password == '123':
old_path = request.GET.get('next')
if old_path:
obj = redirect(old_path)
else:
obj = redirect('/home/')
obj.set_cookie('whoami', 'cwz')
return obj
return render(request, 'login.html')
from functools import wraps
def auth_login(func):
@wraps(func)
def inner(request, *args, **kwargs):
res = func(request, *args, **kwargs)
if request.COOKIES.get('whoami'):
# print(request.get_full_path())
# print(request.path_info)
return res
else:
current_path = request.path_info
return redirect('/login/?next=%s' % current_path) # 沒有登錄的用戶,跳轉到登錄頁面
return inner
@auth_login
def home(request):
if request.COOKIES.get('whoami'):
return HttpResponse('只有登錄成功才能到這兒')
return redirect('/login/')
@auth_login
def index(request):
return HttpResponse('index頁面,登錄之後才能訪問')
@auth_login
def reg(request):
return HttpResponse('reg頁面,登錄之後才能訪問')
@auth_login
def logout(request):
obj = redirect('/login/')
obj.delete_cookie('whoami')
return obj
django操作session
django中session方法
# 獲取、設置、刪除Session中數據
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在則不設置
del request.session['k1']
# 所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 會話session的key
request.session.session_key
# 將所有Session失效日期小於當前日期的數據刪除
request.session.clear_expired()
# 檢查會話session的key在資料庫中是否存在
request.session.exists("session_key")
# 刪除當前會話的所有Session數據
request.session.delete()
# 刪除當前的會話數據並刪除會話的Cookie。
request.session.flush()
這用於確保前面的會話數據不可以再次被用戶的瀏覽器訪問
例如,django.contrib.auth.logout() 函數中就會調用它。
# 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
* 如果value是個整數,session會在些秒數後失效。
* 如果value是個datatime或timedelta,session就會在這個時間後失效。
* 如果value是0,用戶關閉瀏覽器session就會失效。
* 如果value是None,session會依賴全局session失效策略。
註意事項:
由於session是保存在伺服器資料庫的,所以django在操作session時要先執行資料庫遷移命令, 生成django_session表
django 預設的session失效時間是14天
設置session
request.session['k1'] = 'v1'
- django內部自動調用演算法生成一個隨機字元串
- 在django_session添加數據, 數據也是加密處理
- 將產生的隨機字元串返回給客戶端,讓瀏覽器保存, 字元串的形式為 sessionid : 隨機字元串
獲取session值
def get_session(request):
res = request.session.get('k1')
print(res)
return HttpResponse('獲取成功')
django內部處理的事情
- django內部會自動去請求頭裡面獲取cookie
- 拿到sessionid所對應的隨機字元串去django_session表中比對
- 如果比對上了,會將隨機字元串對應的值取出來,放在request.session中。
刪除session
request.session.delete() # 客戶端與服務端的session都會刪除
request.session.flush() # 建議使用
刪除session只會根據瀏覽器的不同刪出對應的數據
設置超時時間
request.session.set_expiry(value)
# 如果value是個整數,session會在些秒數後失效。
# 如果value是個datatime或timedelta,session就會在這個時間後失效。
# 如果value是0,用戶關閉瀏覽器session就會失效。
# 如果value是None,session會依賴全局session失效策略。
django中session配置
Django中預設支持Session,其內部提供了5種類型的Session。
1. 資料庫Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(預設)
2. 緩存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(預設記憶體緩存,也可以是memcache),此處別名依賴緩存的設置
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
4. 緩存+資料庫
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用設置項:
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,預設修改之後才保存(預設)
Django中Session相關設置