一.為什麼需要cookie?
A、B兩人都有自己的京東賬号,且都在本地登入成功過(7天免密登入),此時A将自己的購物車練級發送給B,B用浏覽器通路該連結是無法檢視到A的購物車内容的,B可能直接進入到自己的購物車或者提示B需要重新登入跳轉到了登入頁面。該場景說明,服務端知道通路的用戶端是誰。但是我們都知道http是無狀态的,我們就需要使用cookie來标記用戶端是誰并将其發送給服務端。
二.Cookie及Session
Cookie 是儲存在本地的一組鍵值對。Cookie的工作原理:它是當用戶端通路服務端後,服務端生成的并發送給用戶端并儲存在用戶端本地的一組鍵值對,它是用來儲存使用者的資訊(資訊用戶端自定義)。當浏覽器再次通路時,浏覽器就會自動帶上cookie,這樣伺服器就能通過cookie的内容來判斷服務端是誰了。
雖然cookie在一定程度上解決了”保持狀态”的需求,彌補了http協定的無狀态的缺陷,但是由于cookie本身最大隻支援4096位元組;且cookie是儲存在用戶端本地的,可以被攔截或截取,在安全性上并不能保證。是以,此時需要用session來協助解決最大位元組問題及儲存在本地的安全性問題,session将使用者資訊儲存在伺服器。
那麼,如果将session保持到服務端,用戶端如何通過cookie将服務端的session橋接起來?
這樣就出現了cookie和session如何協助的問題?我們可以給每個用戶端的cookie配置設定一個唯一的id,這樣使用者在通路時,通過cookie,伺服器就知道來的人事誰。然後我們再根據不同cookie的id,在伺服器上儲存一段時間的使用者私密資料。
總結而言:cookie彌補了http無狀态的不足,讓伺服器知道來的人是’誰’;但是cookie以文本的形式儲存在本地,自身安全性較差;是以我們就通過cookie識别不同的使用者,對應的在session裡儲存使用者私密的資訊已及能超過4096位元組的文本。
from django.shortcuts import render,redirect
# Create your views here.
def login(request):
if request.method == 'POST':
if request.POST.get('username') == 'admin' and request.POST.get('pwd') == 'admin':
ret = redirect('/mainmenu/')
ret.set_cookie('username',request.POST.get('username'))
return ret
else:
return render(request, 'login.html')
else:
return render(request, 'login.html')
def mainmenu(request):
print('cookie:',request.COOKIES)
print('sessionname:',request.session.get('username'))
print('sessionpwd:',request.session.get('pwd'))
if request.COOKIES.get('username',None):
return render(request,'mainmenu.html')
else:
return redirect('/login/')
from django.shortcuts import render,redirect
# Create your views here.
def login(request):
if request.method == 'POST':
if request.POST.get('username') == 'admin' and request.POST.get('pwd') == 'admin':
request.session['username'] = request.POST.get('username')
request.session['pwd'] = request.POST.get('pwd')
return redirect('/mainmenu/')
else:
return render(request, 'login.html')
else:
return render(request, 'login.html')
def mainmenu(request):
print('cookie:',request.COOKIES)
print('sessionname:',request.session.get('username'))
print('sessionpwd:',request.session.get('pwd'))
if request.session.get('username',None):
return render(request,'mainmenu.html')
else:
return redirect('/login/')