COOKIE 與 SESSION
簡介
1、cookie不屬於http協議範圍,由於http協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個場景下誕生。
cookie的工作原理是:由服務器產生內容,瀏覽器收到請求後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能通過cookie的內容來判斷這個是“誰”了。
2、cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於cookie本身最大支持4096字節,以及cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節,並且他保存在服務器,有較高的安全性。這就是session。
問題來了,基於http協議的無狀態特徵,服務器根本就不知道訪問者是“誰”。那麼上述的cookie就起到橋接的作用。
我們可以給每個客戶端的cookie分配一個唯一的id,這樣用戶在訪問時,通過cookie,服務器就知道來的人是“誰”。然後我們再根據不同的cookie的id,在服務器上保存一段時間的私密資料,如“賬號密碼”等等。
3、總結而言:cookie彌補了http無狀態的不足,讓服務器知道來的人是“誰”;但是cookie以文本的形式保存在本地,自身安全性較差;所以我們就通過cookie識別不同的用戶,對應的在session裏保存私密的信息以及超過4096字節的文本。
4、另外,上述所說的cookie和session其實是共通性的東西,不限於語言和框架
此處,我們可以模擬用戶登錄,獲取到cookie和session
一、設置html頁面:
一個前臺登錄頁面login.html,一個後臺頁面,就是我們測試過的分頁,一個查看session的backend.html頁面。
login.html
{% extends "base.html" %}
{% block content %}
<div>
<form method="post">
<input type="text" name="username" placeholder="用戶名:">
<input type="text" name="password" placeholder="密碼:">
<input type="submit" value="提交">
</form>
</div>
{% endblock %}
backend.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="container">
<h4>cookie 內容是 {{ cookie_content }}</h4>
<h4>session 內容是 {{ session_content }}</h4>
<h4>登錄用戶名 :{{ username }}</h4>
<a href="../logout">註銷</a>
</div>
</body>
</html>
2、配置後臺views.py邏輯代碼
def login(request):
if request.method == 'GET':
# 第一次登陸跳轉到登陸
return render(request,'login.html')
else:
#當取不到值的時候返回false
Username = request.POST.get('username',False)
Password = request.POST.get('password',False)
# print ('username:',username)
# print ('password:',password)
if not Password or not Username:
return HttpResponse('用戶名密碼不能爲空')
else:
#去數據庫匹匹配賬戶密碼
user_obj = models.Userinfo.objects.filter(username=Username,password=Password)
if user_obj.first():
#登錄成功
#return HttpResponse("歡迎來到我的世界")
#設置session內部的字典內容
request.session['is_login'] = user_obj.first().name
request.session['username'] = Username
#登錄成功就跳轉到後臺頁面
return redirect("/page")
#return redirect('/session')
else:
return HttpResponse("賬號密碼錯誤")
def Session(request):
'''
這裏必須用讀取字典的get()方法把login的value缺省設置爲False,
當用戶訪問backend這個url先嚐試獲取這個瀏覽器對應的session中的
login的值。如果對方登錄成功的話,在login裏就已經把login
的值修改爲了True,反之這個值就是False的
'''
get_session = request.session.get('is_login',False)
#如果爲真,說明用戶正常登錄
if get_session:
cookie_content = request.COOKIES
session_content = request.session
username = request.session['username']
return render(request, 'backend.html',{
'cookie_content':cookie_content,
'session_content':session_content,
'username':username
})
else:
'''
如果訪問的時候沒有攜帶正確的session,
就直接被重定向url回login頁面
'''
return redirect('/login/')
#清除session
def del_session(request):
request.session.clear()
get_session = request.session.get('is_login','退出登錄')
return HttpResponse(json.dumps(get_session))
3、在url.py中配置入口路由
url(r'^login/$', views.login),
url(r'^logout/', views.del_session),
url(r'^session/', views.Session),
4、取消安全訪問機制csrf
注意:csrf生產環境不能去掉,
在setting中註釋下面帶csrf的代碼
5、測試訪問
1、登錄,
當輸入正確的賬戶密碼時,會跳轉到分頁的頁面
2、查看session
此時我們能查看session頁面查看獲取到的session值了
3、清除session
此時,我們清除session以後,http://127.0.0.1:8080/session/這個頁面就不能訪問了,直接跳轉到了Login頁面