網(wǎng)站首頁 編程語言 正文
HTTP被設(shè)計為”?態(tài)”,也就是俗稱“臉盲”。 這?次請求和下?次請求 之間沒有任何狀態(tài)保持,我們?法根據(jù)請求的任何??(IP地址,?戶代理等)來識別來?同??的連續(xù)請求。實現(xiàn)狀態(tài)保持的?式:在客戶端或服務(wù)器端存儲與會話有關(guān)的數(shù)據(jù)(客戶端與服務(wù)器端的?次通信,就是?次會話)
一、Cookies
cookies 是瀏覽器為 Web 服務(wù)器存的??信息。 每次瀏覽器從某個服務(wù)器請求頁面時,都會?動帶上以前收到的cookie。cookie保存在客戶端,安全性較差,注意不要保存敏感信息
1.1、設(shè)置Cookies
HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
# 同上,不同點(diǎn)在于設(shè)置salt,即加鹽
HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)
key:cookie的名稱(*)
value:cookie的值,默認(rèn)是空字符
max_age:cookies的持續(xù)有效時間(以秒計),如果設(shè)置為None,cookies在瀏覽器關(guān)閉的時候就失效了。
expires:cookies的過期時間,格式:"Wdy,DD-Mth-YYHH:MM:SSGMT"如果設(shè)置這個參數(shù),它將覆蓋max_age。
path:cookie?效的路徑前綴,瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣你可以避免將cookie傳給站點(diǎn)中的其他的應(yīng)?。/表示根路徑,根路徑的cookie可以被任何url的??訪問
domain:cookie?效的站點(diǎn)。你可?這個參數(shù)來構(gòu)造?個跨站cookie。如,domain=".example.com"所構(gòu)造的cookie對下?這些站點(diǎn)都是可讀的:www.example.com、www2.example.com。如果該參數(shù)設(shè)置為None,cookie只能由設(shè)置它的站點(diǎn)讀取。
secure:如果設(shè)置為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路由保護(hù)實例
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')
# 這里我們?yōu)榱朔奖悴辉谶M(jìn)行數(shù)據(jù)庫查詢,直接設(shè)置username和password
if postData.get('username') == '123' and postData.get('password') == '123':
res = redirect(reverse('app:index'))
# 設(shè)置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>
我們運(yùn)行項目可以發(fā)現(xiàn),登陸以后我們可以到主界面,但是十秒鐘以后刷新時就需要重新登陸了。
二、Session
cookie看似解決了HTTP(短連接、?狀態(tài))的會話保持問題,但把全部?戶數(shù)據(jù)保存在客戶端,存在安全隱患,于是session出現(xiàn)了。我們可以把關(guān)于?戶的數(shù)據(jù)保存在服務(wù)端,在客戶端cookie?加?個sessionID(隨機(jī)字符串)。其?作流程:
(1)、當(dāng)?戶來訪問服務(wù)端時,服務(wù)端會?成?個隨機(jī)字符串;
(2)、當(dāng)?戶登錄成功后把{sessionID:隨機(jī)字符串}組織成鍵值對加到cookie?發(fā)送給?戶;
(3)、服務(wù)器以發(fā)送給客戶端cookie中的隨機(jī)字符串做鍵,?戶信息做值,保存?戶信息;
(4)、再訪問服務(wù)時客戶端會帶上sessionid,服務(wù)器根據(jù)sessionid來確認(rèn)?戶是否訪問過?站
2.1、區(qū)別與聯(lián)系
這樣我們的信息就保存在了服務(wù)器中,客戶端只保存了SessionID,這樣很安全,但是加重了服務(wù)器的負(fù)擔(dān),每次都需要查詢服務(wù)器,而且分布式中這樣的方式再不同的服務(wù)器上還需要重新登錄。cookie在客戶端存儲值有??的限制,?約?kb,session信息存儲在服務(wù)器則沒有限制
Session基于Cookies實現(xiàn)
2.2、Session的配置
# 這個app默認(rèn)是有的
INSTALLED_APPS = [
'django.contrib.sessions',
]
# 這個中間件默認(rèn)也是有的
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
]
要使用Session必須先進(jìn)行數(shù)據(jù)庫的遷移
2.3、Session的設(shè)置
我們還用上一個例子來講解Session的設(shè)置
只需要修改 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')
# 這里我們?yōu)榱朔奖悴辉谶M(jìn)行數(shù)據(jù)庫查詢,直接設(shè)置username和password
if postData.get('username') == '123' and postData.get('password') == '123':
res = redirect(reverse('app:index'))
# 我們設(shè)置session,這里注意這個方法在request中
request.session['username'] = postData.get('username')
return res
return render(request, 'app/login.html')
我們監(jiān)控我們提交表單的時候我們發(fā)送了什么,headers里面有Cookie
Cookie: csrftoken=SivHHihe4ppXF49toaZ0R2SxBisHyOpfwcU2cGi9K3B7JXdBIT71LAnMBHvinDFL; sessionid=epqs9x94bwy9pf8sf12d48bmg65f6s4l
我們發(fā)現(xiàn)我們發(fā)送了一個sessionID,至于我們保存的username已經(jīng)被保存在了數(shù)據(jù)庫中,這也是為什么要進(jìn)行數(shù)據(jù)遷移的原因。
2.4、Session的刪除
# clear 清空所有session,但不會把表中的數(shù)據(jù)刪除
# flush 清空所有并刪除表中數(shù)據(jù)
# logout 退出登錄,清除所有并刪除表中數(shù)據(jù)
# 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
相關(guān)推薦
- 2022-11-14 關(guān)于C++解決內(nèi)存泄漏問題的心得
- 2021-04-13 手動清理 Memcached 緩存的方法
- 2022-10-06 Iptables防火墻自定義鏈表實現(xiàn)方式_安全相關(guān)
- 2022-09-03 利用python合并csv文件的方式實例_python
- 2022-10-17 C++中友元類和嵌套類使用詳解_C 語言
- 2023-02-27 nginx編譯安裝及常用參數(shù)詳解_nginx
- 2022-10-08 Pandas數(shù)據(jù)分析之pandas數(shù)據(jù)透視表和交叉表_python
- 2023-02-15 PyQt5頁面跳轉(zhuǎn)問題及解決方式_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支