cookie和session實現登錄驗證


回話技術,比如在做登錄功能的時候,需要配合是用存儲在客戶端的cookie信息,以及存儲在服務端的session來實現登錄功能。在cookie中保存了用戶的信息,特別是一個特殊的令牌信息,當用戶拿着這個特殊的令牌來訪問網站的時候,網站會從cookie中獲取這個特殊令牌去數據庫session中去查詢是否有這個對應的令牌的信息,如果有則驗證成功,就可以把用戶的信息返回給客戶端了,如果驗證失敗則提示用戶沒有登錄等等提示信息。

cookie不屬於http協議范圍,由於http協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個場景下誕生。

cookie的工作原理是:由服務器產生內容,瀏覽器收到請求后保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能通過cookie的內容來判斷這個是“誰”了。

cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於cookie本身最大支持4096字節,以及cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節,並且他保存在服務器,有較高的安全性。這就是session。

問題來了,基於http協議的無狀態特征,服務器根本就不知道訪問者是“誰”。那么上述的cookie就起到橋接的作用。

我們可以給每個客戶端的cookie分配一個唯一的id,這樣用戶在訪問時,通過cookie,服務器就知道來的人是“誰”。然后我們再根據不同的cookie的id,在服務器上保存一段時間的私密資料,如“賬號密碼”等等。

總結而言:cookie彌補了http無狀態的不足,讓服務器知道來的人是“誰”;但是cookie以文本的形式保存在本地,自身安全性較差;所以我們就通過cookie識別不同的用戶,對應的在session里保存私密的信息以及超過4096字節的文本。

另外,上述所說的cookie和session其實是共通性的東西,不限於語言和框架

####

HTTP 協議是無狀態的。因此,若不借助其他手段,遠程的服務器就無法知道以前和客戶端做了哪些通信。Cookie 就是「其他手段」之一。 Cookie 一個典型的應用場景,就是用於記錄用戶在網站上的登錄狀態。

用戶登錄成功后,服務器下發一個(通常是加密了的)Cookie 文件。客戶端(通常是網頁瀏覽器)將收到的 Cookie 文件保存起來。下次客戶端與服務器連接時,將 Cookie 文件發送給服務器,由服務器校驗其含義,恢復登錄狀態(從而避免再次登錄)。

#####

1.1 描述
瀏覽器端的回話技術
cookie本身由瀏覽器生成,通過Response將cookie寫在瀏覽器上,下一次訪問,瀏覽器會根據不同的規則攜帶cookie過來

#####

1.2 cookie方法
設置:response.set_cookie(key, value, max_age=None, exprise=None)

獲取:request.GET.get(key)

刪除:request.delete_cookie(key)

注意:cookie不能跨瀏覽器

參數定義:

max_age和exprise時間:

max_age :  整數,指定cookie過期時間,以秒為單位

exprise: 整數,指定過期時間,還支持是一個datetime或者timedelta,可以指定一個具體日期時間

設置10天后過期:

exprise=datetime.datetime.now() + timedelta(days=10) 10天后過期

永不過期:

exprise設置為None表示為永不過期

####

2. session

#####

2.1 描述
服務端會話技術,依賴於cookie

#####

2.2 開啟session設置

1)django中啟用SESSION

在settings中修改如下地方

INSTALLED_APPS:
‘django.contrib.sessions’

MIDDLEWARE:
‘django.contrib.sessions.middleware.SessionMiddleware’

每個HttpResponse對象都有一個session屬性,也是一個類字典對象

#####

2.3 常用操作
request.session[‘user’] = username 設置數據

request.session.get(key, default=None) 根據鍵獲取會話的值

request.session.flush() 刪除當前的會話數據並刪除會話的cookie,django.contrib.auth.logout() 函數中就會調用它。

request.session.session_key 獲 大專欄  cookie和session實現登錄驗證取sessionid值

request.session.delete(request.session.session_key) 刪除當前用戶的所有Session數據

del request.session['key'] 刪除session中的key值

request.session.set_expiry(value)
如果value是個整數,session會在些秒數后失效
如果value是個datatime或timedelta,session就會在這個時間后失效。
如果value是0,用戶關閉瀏覽器session就會失效。


數據存儲到數據庫中會進行編碼使用的是base64

3.使用session+cookie實現登錄驗證

1.創建登錄驗證的views方法
def (request):
if request.method == 'GET':
return render(request,'login.html')
if request.method == 'POST':

username = request.POST.get('username')
password = request.POST.get('password')
# 2.校驗數據完整性
flag = all([username,password])

if not flag:
msg = '用戶名密碼不能為空'
return render(request, 'login.html', {'msg': msg})
# 3.驗證用戶是否注冊
user = User.objects.filter(username=username).first()
if not user:
msg = '該賬戶未注冊,請去注冊'
return render(request, 'login.html', {'msg': msg})
# 4.校驗密碼
if user.password != password:
msg = '密碼不正確'
return render(request, 'login.html', {'msg': msg})
# 1.使用cookie+session


# 向cookie中設置sessionid值
# 向django_session表中存sessionid值
request.session['user_id'] = user.id
return HttpResponseRedirect(reverse('user:index'))
2.創建相應的裝飾器
def login_required(func):
def check_login(request):
try:
# 驗證cookie中的sessionid值是否存在
# 驗證服務端django_session表中是否存在對應的記錄信息
# 如果存在則獲取是否設置的user_id值
request.session['user_id']
except Exception as e:
return HttpResponseRedirect(reverse('user:login'))
return func (request)

return check_login
3.實現注銷

def logout(request):
if request.method == 'GET':
del request.session['user_id']

return HttpResponse('注銷成功')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM