網站首頁 編程語言 正文
HTTP被設計為”?態”,也就是俗稱“臉盲”。 這?次請求和下?次請求 之間沒有任何狀態保持,我們?法根據請求的任何??(IP地址,?戶代理等)來識別來?同??的連續請求。實現狀態保持的?式:在客戶端或服務器端存儲與會話有關的數據(客戶端與服務器端的?次通信,就是?次會話)
一、Cookies
cookies 是瀏覽器為 Web 服務器存的??信息。 每次瀏覽器從某個服務器請求頁面時,都會?動帶上以前收到的cookie。cookie保存在客戶端,安全性較差,注意不要保存敏感信息
1.1、設置Cookies
HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
# 同上,不同點在于設置salt,即加鹽
HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
key:cookie的名稱(*)
value:cookie的值,默認是空字符
max_age:cookies的持續有效時間(以秒計),如果設置為None,cookies在瀏覽器關閉的時候就失效了。
expires:cookies的過期時間,格式:"Wdy,DD-Mth-YYHH:MM:SSGMT"如果設置這個參數,它將覆蓋max_age。
path:cookie?效的路徑前綴,瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣你可以避免將cookie傳給站點中的其他的應?。/表示根路徑,根路徑的cookie可以被任何url的??訪問
domain:cookie?效的站點。你可?這個參數來構造?個跨站cookie。如,domain=".example.com"所構造的cookie對下?這些站點都是可讀的:www.example.com、www2.example.com。如果該參數設置為None,cookie只能由設置它的站點讀取。
secure:如果設置為True,瀏覽器將通過HTTPS來回傳cookie。
httponly:僅http傳輸不能使?js獲取cookie
1.2、獲取Cookies
# 獲取cookie
HttpRequest.COOKIES.get(key)
# 獲取加“鹽”的cookie
HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='',max_age=None)
1.3、刪除Cookies
# 刪除cookie
HttpResponse.delete_cookie(key, path='/', domain=None)
1.4、Cookies路由保護實例
app/views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect
from django.urls import reverse
def check_login(func):
def inner(request, *args, **kwargs):
if request.COOKIES.get('username'):
return func(request, *args, **kwargs)
else:
return redirect(reverse('app:login'))
return inner
@check_login
def index(request):
return HttpResponse(request.COOKIES.get('username') + ' is login')
def login(request):
if request.method == 'POST':
postData = request.POST.dict()
postData.pop('csrfmiddlewaretoken')
# 這里我們為了方便不在進行數據庫查詢,直接設置username和password
if postData.get('username') == '123' and postData.get('password') == '123':
res = redirect(reverse('app:index'))
# 設置10s后過期
res.set_cookie(key='username', value=postData.get('username'), max_age=10)
return res
return render(request, 'app/login.html')
app/urls.py
from django.urls import path, include
from app import views
app_name = 'app'
urlpatterns = [
path('index/', views.index, name='index'),
path('login/', views.login, name='login'),
]
template/app/login.html
doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
head>
<body>
<form action="http://127.0.0.1:8000/app/login/" method="post">
{% csrf_token %}
username:<input type="text" name="username">
password:<input type="text" name="password">
<input type="submit">
form>
body>
html>
我們運行項目可以發現,登陸以后我們可以到主界面,但是十秒鐘以后刷新時就需要重新登陸了。
二、Session
cookie看似解決了HTTP(短連接、?狀態)的會話保持問題,但把全部?戶數據保存在客戶端,存在安全隱患,于是session出現了。我們可以把關于?戶的數據保存在服務端,在客戶端cookie?加?個sessionID(隨機字符串)。其?作流程:
(1)、當?戶來訪問服務端時,服務端會?成?個隨機字符串;
(2)、當?戶登錄成功后把{sessionID:隨機字符串}組織成鍵值對加到cookie?發送給?戶;
(3)、服務器以發送給客戶端cookie中的隨機字符串做鍵,?戶信息做值,保存?戶信息;
(4)、再訪問服務時客戶端會帶上sessionid,服務器根據sessionid來確認?戶是否訪問過?站
2.1、區別與聯系
這樣我們的信息就保存在了服務器中,客戶端只保存了SessionID,這樣很安全,但是加重了服務器的負擔,每次都需要查詢服務器,而且分布式中這樣的方式再不同的服務器上還需要重新登錄。cookie在客戶端存儲值有??的限制,?約?kb,session信息存儲在服務器則沒有限制
Session基于Cookies實現
2.2、Session的配置
# 這個app默認是有的
INSTALLED_APPS = [
'django.contrib.sessions',
]
# 這個中間件默認也是有的
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
]
要使用Session必須先進行數據庫的遷移
2.3、Session的設置
我們還用上一個例子來講解Session的設置
只需要修改 views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect
from django.urls import reverse
def check_login(func):
def inner(request, *args, **kwargs):
if request.session.get('username'):
return func(request, *args, **kwargs)
else:
return redirect(reverse('app:login'))
return inner
@check_login
def index(request):
return HttpResponse(request.session.get('username') + ' is login')
def login(request):
if request.method == 'POST':
postData = request.POST.dict()
postData.pop('csrfmiddlewaretoken')
# 這里我們為了方便不在進行數據庫查詢,直接設置username和password
if postData.get('username') == '123' and postData.get('password') == '123':
res = redirect(reverse('app:index'))
# 我們設置session,這里注意這個方法在request中
request.session['username'] = postData.get('username')
return res
return render(request, 'app/login.html')
我們監控我們提交表單的時候我們發送了什么,headers里面有Cookie
Cookie: csrftoken=SivHHihe4ppXF49toaZ0R2SxBisHyOpfwcU2cGi9K3B7JXdBIT71LAnMBHvinDFL; sessionid=epqs9x94bwy9pf8sf12d48bmg65f6s4l
我們發現我們發送了一個sessionID,至于我們保存的username已經被保存在了數據庫中,這也是為什么要進行數據遷移的原因。
2.4、Session的刪除
# clear 清空所有session,但不會把表中的數據刪除
# flush 清空所有并刪除表中數據
# logout 退出登錄,清除所有并刪除表中數據
# del req.session['key'] 刪除某一個session值
def logout(request):
request.session.flush()
return redirect(reverse("App:login"))
原文鏈接:https://blog.csdn.net/weixin_43903639/article/details/122886603
相關推薦
- 2023-03-25 Python?Flask-Login模塊使用案例詳解_python
- 2023-03-01 Shell?$[]對整數進行數學運算實現_linux shell
- 2022-04-25 C#關于Func和Action委托的介紹詳解_C#教程
- 2022-11-20 Python利用pangu模塊實現文本格式化小工具_python
- 2022-06-20 Android?Flutter實現點贊效果的示例代碼_Android
- 2022-10-07 Android實現點擊圖片上傳SQLite數據庫_Android
- 2022-10-08 ASP.NET泛型一之泛型簡介與基本語法_實用技巧
- 2022-09-06 C#面向對象編程中開閉原則的示例詳解_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支