Cookie與Session

文章目錄

  • Cookie的介紹
    • Cookie的由來
    • 什么是Cookie
    • Cookie原理
    • Cookie覆蓋
    • 瀏覽器查看Cookie
  • 在Django中操作Cookie
    • 設置Cookie
    • 查詢瀏覽器攜帶的Cookie
    • 刪除Cookie
  • Cookie校驗登錄
  • session

Cookie的介紹

Cookie的由來

首先我們都應該明白HTTP協議是無連接的。

無狀態的意思是每次請求都是獨立的,它的執行情況和結果與前面的請求和之后的請求都無直接關系,它不會受前面的請求響應情況直接影響,也不會直接英系那個后面的請求響應情況。

所以對服務端來說,每一次請求都是全新的。

狀態也就是說在于服務端進行連接的過程中產生的數據,基于HTTP無連接的特性,在下一次與服務端進行連接之后又是一次全新的狀態,之前的狀態不會保存絲毫。

如果說我們要保存狀態的話,便于下一次或更多次于服務端進行連接都擁有之前的狀態,那么Cookie就誕生在這種需求下。


什么是Cookie

其實Cookie是key-value結構,類似于一個python中的字典。隨著服務器端的響應發送給客戶端瀏覽器。然后客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。Cookie是由服務器創建,然后通過響應發送給客戶端的一個鍵值對。客戶端會保存Cookie,并會標注出Cookie的來源(哪個服務器的Cookie)。當客戶端向服務器發出請求時會把所有這個服務器Cookie包含在請求中發送給服務器,這樣服務器就可以識別客戶端了!


Cookie原理

Cookie的工作原理:在服務器產生后Cookie發送給瀏覽器,然后瀏覽器將其保存在本地;下次瀏覽器訪問服務器時攜帶這個Cookie,那么服務端就能根據這個Cookie內容判斷這個瀏覽器是誰了。

注意:不同瀏覽器之間是不共享Cookie的。也就是說在你使用IE訪問服務器時,服務器會把Cookie發給IE,然后由IE保存起來,當你使用Chrome訪問服務器時,不可能把IE保存的Cookie發送給服務器。


Cookie覆蓋

服務端重復發送Cookie是會覆蓋瀏覽器原有Cookie的,例如:瀏覽器第一次請求服務端返回的Cookie是:name:jack;瀏覽器第二次請求之后服務端又發送了Cookie給瀏覽器:name:tom;那么瀏覽器只會留下新的Cookie,也就是:name:tom;

注意:如果key不一樣的話則不會覆蓋,因為一個Cookie可以由好很多key-value組成

瀏覽器查看Cookie

window可以通過F12打開開發者選項,選擇Application選項下面的Cookies
在這里插入圖片描述

在已經開啟的頁面使用開發者選項可以看不到內容,我們再刷新一下頁面就可以了。


在Django中操作Cookie

Django就是我們的服務端,瀏覽器向它發送請求我們可以返回一個Cookie。

設置Cookie

我們可以給基于HttpResponse類返回數據到瀏覽器的方法設置Cookie,如:render、redirect、JsonResponse等

	request = HttpResponse('...')data = render('...')response.set_cookie(key,value)data.set_cookie(key,value)

set_cookie可以設置的參數:

  • key:鍵
  • value:值
  • max_age=None,超時時間,cookie需要延續的時間(以秒為單位)如果參數是\None’',這個–cookie會延續到瀏覽器關閉為止
  • expires=None,超時時間(IE requires expires,so set it if hasn’t been already.)
  • path=‘/’,Cookie生效的路徑,/表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問,瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將cookie傳給站點中的其他的應用。
  • domain針對哪個域名有效。默認是針對主域名下都有效,如果只要針對某一個子域名才有效,那么可以設置這個屬性
  • secure=False,瀏覽器將通過HTTPS來回傳cookie
  • httponly=False,只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到可以被覆蓋)

set_signed_cookie:可以對Cookie的value值進行加鹽

	def index(request):response = HttpResponse('Hello World!')response.set_cookie('name','jack')response.set_signed_cookie('sex','man',salt='加鹽')return response

在這里插入圖片描述

signed_cookie 只是加了簽名的cookie,而不是被加密的cookie,在客戶端還是可以看到沒有加密的value的

注解作用:

單純的記錄uid或者用戶名在cookie中很容易被篡改(也是不建議將用戶敏感信息記錄在cookie中的原因),萬一攻擊者把uid=1換成uid=2豈不是可以訪問uid=2用戶的資源了嗎?而如果換成uid=2r5khk:5Qi0PuFkFQxAFkDnM-UsSljHHxM那么服務端不僅檢驗uid,還檢驗uid=2后面的簽名字段,即是調用HttpRequest.get_signed_cookie(key=key,sait=sait),這樣即使用戶把cookie中的value換成uid=2,但是沒有簽名,服務端照樣拒絕訪問資源。


查詢瀏覽器攜帶的Cookie

當我們響應給客戶端Cookie保存以后,下次客戶端訪問我們的服務端就會攜帶這個Cookie來訪問。

在這里插入圖片描述
我們可以在視圖接收到客戶端的請求里面提取出Cookie的鍵值對,針對正常設置的Cookie和加鹽的Cookie取值方式有所不同

def index(request):print(request.COOKIES['name'])  # 方式一:不推薦使用此方式,如果key不存在則會拋出異常:KeyErrorprint(request.COOKIES.get('name'))  # 方式二:獲取name鍵對應的value,如果key不存在則返回Noneprint(request.get_signed_cookie('sex',salt='加鹽')) # 獲取加鹽過的cookie鍵值,salt必須要對上不然報錯return HttpResponse('Hello World!')

在這里插入圖片描述

在這里插入圖片描述

刪除Cookie

刪除瀏覽器請求里攜帶的某個Cookie

	def index(request):response = HttpResponse('Hello World!')response.delete_cookie('sex')return response

在這里插入圖片描述


Cookie校驗登錄

通過登錄之后在瀏覽器添加Cookie,只有攜帶該Cookie才能訪問home頁面。

視圖層代碼

from app import models
def login(request,*arg,**kwargs):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')'''查詢數據庫中的用戶數據比對'''obj = models.UserInfo.objects.filter(username=username,password=password).first()if obj:response = HttpResponse('login success!')response.set_cookie('name', username, max_age=30)response.set_cookie('msg','True',max_age=30)  # 定義過期時間# 它們分別都在30秒后過期,也就是瀏覽器只有30秒使用這個Cookie的時間,過了30秒以后再次訪問將不能攜帶該Cookiereturn responseelse:return HttpResponse('賬號或密碼錯誤!')return render(request,'login.html')def home(request):try:name = request.COOKIES['name']msg = request.COOKIES['msg']if name and msg == 'True':  # 判斷瀏覽器攜帶的Cookie是否合格return render(request,'home.html')return redirect('/login/') # 不合格重定向到登錄頁面except: # 沒有獲取到指定Cookie的話,則說明Cookie過期了,重定向到登錄頁面return redirect('/login/')

在這里插入圖片描述
進入home頁面是在請求里頭攜帶了服務端在瀏覽器登錄時響應的Cookie,再次將該Cookie發送給服務端才能得到home頁面的響應。
在這里插入圖片描述
待我們30秒后再次刷新home頁面時,就會被重定向到登錄界面,因為Cookie過期了
在這里插入圖片描述


如果需要有多個視圖函數需要使用時,這種的每次都需要寫重復的代碼,這樣代碼的重復性就太高了,所以我們可以做一個裝飾器用來存儲這些重復的代碼

'''檢驗用戶登錄的狀態的裝飾器'''
def login_auth(xxx):def inner(request, *args, **kwargs):'''獲取到用戶上一次想要訪問的urlpath_info ----只有路由地址get_full_path ----可以訪問到瀏覽器后攜帶的get參數'''if request.COOKIES.get('name'):return xxx(request,*args, **kwargs)else:return redirect('/login/') # 通過后綴的方式告知跳轉那一個return innerfrom app import models
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')'''查詢數據庫中的用戶數據比對'''obj = models.UserInfo.objects.filter(username=username,password=password).first()if obj:response = HttpResponse('login success!')response.set_cookie('name', username, max_age=30)response.set_cookie('msg','True',max_age=30)  # 定義過期時間# 它們分別都在30秒后過期,也就是瀏覽器只有30秒使用這個Cookie的時間,過了30秒以后再次訪問將不能攜帶該Cookiereturn responseelse:return HttpResponse('賬號或密碼錯誤!')return render(request,'login.html')@login_out
def func(request):return HttpResponse('from func')def home(request):try:# name = request.COOKIES['name']# msg = request.COOKIES['msg']name = request.COOKIES.get('name')msg = request.COOKIES.get('msg')if name and msg == 'True':  # 判斷瀏覽器攜帶的Cookie是否合格return render(request, 'home.html')return redirect('/login/')  # 不合格重定向到登錄頁面except:  # 沒有獲取到指定Cookie的話,則說明Cookie過期了,重定向到登錄頁面return redirect('/login/')

session

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161221.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CSS特效016:天窗揚起合上的效果

CSS常用示例100專欄目錄 本專欄記錄的是經常使用的CSS示例與技巧,主要包含CSS布局,CSS特效,CSS花邊信息三部分內容。其中CSS布局主要是列出一些常用的CSS布局信息點,CSS特效主要是一些動畫示例,CSS花邊是描述了一些CSS…

【c++Leetcode】206. Reverse Linked List

問題入口 time complexity: O(n), space complexity:O(1) ListNode* reverseList(ListNode* head) {ListNode* prev nullptr;ListNode* curr head;while(curr){ListNode* forward curr->next;curr->next prev;prev curr;curr forward;}return prev; } time comp…

虹科Pico汽車示波器 | 汽車免拆檢修 | 2017款東風本田XR-V車轉向助力左右不一致

一、故障現象 一輛2017款東風本田XR-V車,搭載R18ZA發動機,累計行駛里程約為4萬km。車主反映,車輛行駛或靜止時,向右側轉向比向左側轉向沉重。 二、故障診斷 接車后試車,起動發動機,組合儀表上無故障燈點亮&…

數據倉庫崗面試

1.自我介紹 2.求用戶連續登錄3天,要講出多種解法 解法1(使用SQL): SELECTuserid FROMloginrecord WHEREDATEDIFF(day, time, LAG(time) OVER (PARTITION BY userid ORDER BY time)) 1AND DATEDIFF(day, LAG(time) OVER (PARTI…

SQL知多少?這篇文章讓你從小白到入門

個人網站 本文首發公眾號小肖學數據分析 SQL(Structured Query Language)是一種用于管理和處理關系型數據庫的編程語言。 對于想要成為數據分析師、數據庫管理員或者Web開發人員的小白來說,學習SQL是一個很好的起點。 本文將為你提供一個…

ElasticSearch之系統關鍵配置

集群名稱 在配置文件$ES_HOME/config/elasticsearch.yml中指定,樣例如下: cluster:name: logging-prod或者 cluster.name: logging-prod節點的名稱 在配置文件$ES_HOME/config/elasticsearch.yml中指定,樣例如下: node:name:…

frp內網穿透配置以及相關端口、過程解釋

介紹 假設現有外網筆記本、云服務器、內網工作站三臺設備,希望使用外網筆記本通過云服務器轉發,訪問內網工作站;這里使用frp進行內網穿透。 云服務器端配置 登錄騰訊輕量型云服務器控制臺,開放轉發端口、bind_port以及deshboad…

opencv-圖像輪廓

輪廓可以簡單認為成將連續的點(連著邊界)連在一起的曲線,具有相同的顏色或者灰度。輪廓在形狀分析和物體的檢測和識別中很有用。 ? 為了更加準確,要使用二值化圖像。在尋找輪廓之前,要進行閾值化處理或者 Canny 邊界檢…

uni-app小程序 swiper 分頁器樣式修改

小程序中使用 wx-swiper-dot和wx-swiper-dot-active選擇器 H5中使用uni-swiper-dot和uni-swiper-dot-active選擇器 .swiper {height: 408px;margin-bottom: 28rpx;::v-deep .uni-swiper-dot {background: #e7e7e7;&.uni-swiper-dot-active {background: #b1b1b1;}}// #ifde…

php文件上傳例子

目錄結構&#xff1a; index.html代碼&#xff1a; <!DOCTYPE html> <html><head><title>文件上傳</title><meta charset"utf-8"></head><body><form action"./up.php" method"post" encty…

PHP基礎與安全

基礎 1. 簡介概述 ●PHP是腳本語言-是一門弱類型語言&#xff0c;不需要事先編譯 ●PHP 腳本在服務器上執行&#xff0c;然后向瀏覽器發送回純文本的 HTML 結果 ●超文本預處理器&#xff0c;服務器端腳本語 2.創建&#xff08;聲明&#xff09;PHP變量 ● 變量以 $ 符號開…

安防視頻EasyCVR平臺太陽能供電+4G攝像頭視頻監控方案的建設

在工地、光伏、風電站、水庫河道等場景中&#xff0c;以及一些偏遠地區的項目現場&#xff0c;會存在無網無電情況&#xff0c;大大制約了視頻監控系統建設的效率及可行性。在這種場景中&#xff0c;我們也可以通過太陽能供電4G監控攝像機的方案&#xff0c;滿足偏遠地區無網無…

【bug 回顧】上傳圖片超時

測試 bug 問題分析 - 上傳圖片超時 最近在測試上遇到一個莫名奇妙的問題&#xff0c;最后也沒有得到具體是哪塊的原因&#xff0c;看各位大佬有沒有思路&#xff1f;&#xff1f; 一 、背景 現在我們有三臺服務器&#xff0c;用來布兩套環境。其中另外一臺服務器3配置的 tom…

JVM中判斷對象是否需要回收的方法

在堆里面存放著Java 世界中幾乎所有的對象實例&#xff0c;垃圾收集器在對堆進行回收前&#xff0c;第一件事情就是要確定這些對象之中哪些還“ 存活 ” 著&#xff0c;哪些已經 “ 死去 ”。 引用計數算法 引用計數法是一種內存管理技術&#xff0c;它是通過對每個對象進行引用…

likeshop單商戶商城系統 任意文件上傳漏洞復現

0x01 產品簡介 likeshop單商戶標準商城系統適用于B2C、單商戶、自營商城場景。完美契合私域流量變現閉環交易使用。 系統擁有豐富的營銷玩法&#xff0c;強大的分銷能力&#xff0c;支持電子面單和小程序直播等功能。無論運營還是二開都是性價比極高的100%開源商城系統。 0x02…

java--飛翔的小鳥

游戲玩法&#xff1a;通過鼠標點擊使小鳥上下移動穿過柱子并完成得分&#xff0c;小鳥碰到柱子或掉落到地面上都會結束游戲。 游戲內圖片 Brid類&#xff1a; package bird;import org.omg.CORBA.IMP_LIMIT;import javax.imageio.ImageIO; import java.awt.image.BufferedIma…

前置聲明避免循環依賴

當你有兩個類互相引用的情況時&#xff0c;使用前置聲明可以幫助你避免循環依賴。以下是一個簡單的例子&#xff0c;其中包含兩個頭文件、兩個源文件以及一個 main 函數的示例 Toolnterface.h #pragma once#include <QString>// Forward declaration of QToolBase clas…

Eclipse常用設置-亂碼

在用Eclipse進行Java代碼開發時&#xff0c;經常會遇到一些問題&#xff0c;記錄下來&#xff0c;方便查看。 一、properties文件亂碼 常用的配置文件properties里中文的亂碼&#xff0c;不利于識別。 處理流程&#xff1a;Window -> Preferences -> General -> Ja…

golang學習筆記——羅馬數字轉換器

文章目錄 羅馬數字轉換器代碼 參考LeetCode 羅馬數字轉整數代碼 羅馬數字轉換器 編寫一個程序來轉換羅馬數字&#xff08;例如將 MCLX 轉換成 1,160&#xff09;。 使用映射加載要用于將字符串字符轉換為數字的基本羅馬數字。 例如&#xff0c;M 將是映射中的鍵&#xff0c;其值…

Qt+sqlite3使用事務提升插入效率

參考&#xff1a; 【精選】SQLite批量插入效率_sqlite 批量插入_PengX_Seek的博客-CSDN博客 (1)不使用事務時&#xff1a; clock_t t_start clock();QSqlQuery query(db);QString sql("insert into test(col1,col2) values(1,2);");for (int i 0; i < 1000; i…