網站首頁 編程語言 正文
1. cookie和session介紹
1.1 cookie 簡介
cookie
是指某些網站為了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數據(通常經過加密)。由網景公司的前雇員盧·蒙特利在1993年3月發明。
Cookie
保存在客戶端中,按在客戶端中的存儲位置,可分為內存Cookie
和硬盤Cookie
。
因為HTTP
協議是無狀態的,即服務器不知道用戶上一次做了什么,這嚴重阻礙了交互式Web應用程序(購物網站)的實現。在典型的網上購物場景中,用戶瀏覽了幾個頁面,買了一些東西。最后結帳時,由于HTTP
的無狀態性,不通過額外的手段,服務器并不知道用戶到底買了什么,所以Cookie
就是用來繞開HTTP
的無狀態性的“額外手段”之一。服務器可以設置或讀取Cookie
中包含的信息,借此維護用戶跟服務器會話中的狀態。
cookie
除了能記錄之前歷史的功能外還可以用于識別用戶身份。
1.2 cookie的缺陷
- Cookie會被附加在每個HTTP請求中,所以無形中增加了流量。
- 由于HTTP請求中的Cookie是明文傳遞的,所以安全性成問題,除非使用超文本傳輸安全協定。
- Cookie的大小限制在4 KB左右,對于復雜的存儲需求來說是不夠用的。
1.3 session簡介
會話(session):會話是一種持久的網絡協議,用于完成服務器和客戶端之間的一些交互行為。會話是一個比連接粒度更大的概念,一次會話可能包含多次連接,每次連接都被認為是會話的一次操作。
在Web中,Session
是指一個用戶與網站服務器進行一系列交互的持續時間,通常指從注冊進入系統到注銷退出系統之間所經過的時間,以及在這段時間內進行的操作,還有,服務器端為保存用戶狀態開辟的存儲空間。
1.4 session與cookie的區別
Cookie以文本文件格式存儲在瀏覽器中,而session存儲在服務端。
cookie的存儲限制了數據量,只允許4KB,而session是無限制的。
cookie包含在每一個客戶端請求報文中,因此容易被人捕獲。
cookie和session都可以設置過期時間
2. 設置cookie
2.1 設置cookie
HTML
代碼:
Title
Set Cookie OK
views.py
代碼
from django.shortcuts import render, HttpResponse def set_cookie(request): """ 先設置 """ # cookie_obj = HttpResponse("set cookie OK") cookie_obj = render(request, "setCookie.html") """ 設置cookie """ cookie_obj.set_cookie("Name", "Hello") cookie_obj.set_cookie("is_cookis", True) return cookie_obj
urls.py
代碼
from django.contrib import admin from django.urls import path from appName import views
2.2 獲取cookie
views.py
from django.shortcuts import render, HttpResponse def get_cookie(request): cookie_obj = render(request, "getCookie.html") print(request.COOKIES.get("Name")) print(request.COOKIES.get("is_cookis")) return cookie_obj #結果: Hello True # request.COOKIES.get(Key) 獲取cookie
2.3 刪除cookie
views.py
from django.shortcuts import render, HttpResponse def del_cookie(request): cookie_obj = HttpResponse("Delete cookie OK") # 把cookis "is_cookis" 刪除 cookie_obj.delete_cookie("is_cookis") return cookie_obj # 執行結果: Hello None
測試流程:
1. 先訪問 set_cookie設置cookie
2. 訪問 get_cookie獲取cookie:Name:Hello和"is_cookis", True
3. 訪問 del_cookie 刪除is_cookis
4. 最后再訪問 get_cookie 獲取cookie, 發現只有Name Hello,is_cookis的值為:None?
2.4 設置過期時間和加鹽
cookie的過期時間,如果不寫,關閉瀏覽器,cookie就失效了
obj.set_cookie('key','value')
也可以設置過期時間:
?obj.set_cookie('key','value',expires=10)
設置10s過期
對cookie進行加鹽
obj.set_signed_cookie('nb','yes','123',expires=1000)
獲取加鹽的cookie
nb=request.get_signed_cookie('nb',salt='123')
2.5 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=None, Cookie生效的域名 你可用這個參數來構造一個跨站cookie。如, domain=”.example.com”所構造的cookie對下面這些站點都是可讀的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果該參數設置為 None ,cookie只能由設置它的站點讀取 secure=False, 瀏覽器將通過HTTPS來回傳cookie httponly=False 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
3. 設置 session
3.1 設置,修改,刪除session
搭建一個簡單的網站,必須要登錄才可以訪問。
HTML
代碼:
index.html
Title 歡迎用戶:{{ name }} 登錄:
只有登錄才能看到。
login.html
Title
delete.html
Title 請先登錄
后端代碼:
views.py
代碼
from django.shortcuts import render, HttpResponse, redirect def login(request): if request.method == "POST": name = request.POST.get("Name") password = request.POST.get("PassWord") print(name, password) # 模擬數據庫校驗密碼 if name == "Hans" and password == "123": request.session["name"] = name # 設置session request.session['is_login'] = True return redirect("/index/") else: return render(request, "login.html") def index(request): is_login = request.session.get("is_login") name = request.session.get("name") print("獲取到name", name) # 更新session request.session['name'] = "HELLO" # 更新session # 重新獲取name name = request.session.get("name") if is_login: return render(request, "index.html", locals()) else: return redirect("/login/") def delete(request): name = request.session.get("name") if request.method == "POST": del request.session['is_login'] # 刪除session del request.session['name'] # request.session.flush() # 清空cookie和session return HttpResponse("%s 已經退出" % name) return render(request, "delete.html") #刪除cookie del request.session['name'] # 刪除某一個session request.session.delete() # 刪除數據庫里的session request.session.flush() # cookie和數據庫都刪
路由urls.py
from django.contrib import admin from django.urls import path from appName import views urlpatterns = [ path('admin/', admin.site.urls), path('index/', views.index), path('login/', views.login), path('delete/', views.delete), ]
3.2 session的其他方法
設置Session數據 request.session.setdefault('k1',123) # 存在則不設置 # 所有 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 會話session的key(隨機字符串) request.session.session_key # 將所有Session失效日期小于當前日期的數據刪除 request.session.clear_expired() # 檢查會話session的key在數據庫中是否存在 request.session.exists("session_key") # 刪除當前會話的所有Session數據(只刪數據庫) request.session.delete() # 刪除當前的會話數據并刪除會話的Cookie(數據庫和cookie都刪) request.session.flush() 這用于確保前面的會話數據不可以再次被用戶的瀏覽器訪問 # 設置會話Session和Cookie的超時時間 request.session.set_expiry(value) * 如果value是個整數,session會在些秒數后失效。 * 如果value是個datatime或timedelta,session就會在這個時間后失效。 * 如果value是0,用戶關閉瀏覽器session就會失效。 * 如果value是None,session會依賴全局session失效策略。
3.3 session的其他配置(配置文件中)
1. 數據庫Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認) 2. 緩存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置 3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() 4. 緩存+數據庫 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用設置項: SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認) SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # Session的cookie失效日期(2周)(默認) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期(默認) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存(默認)
原文鏈接:https://www.cnblogs.com/hans-python/p/16029143.html
相關推薦
- 2022-10-19 Android項目中引入aar包的正確方法介紹_Android
- 2022-05-18 Python3的正則表達式詳解_python
- 2022-11-17 C#?函數返回多個值的方法詳情_C#教程
- 2023-01-31 Python函數用法和底層原理分析_python
- 2022-06-18 Go語言學習之時間函數使用詳解_Golang
- 2022-06-21 分享四個python接口常用封裝函數_python
- 2022-10-23 Kubernetes?k8s?configmap?容器技術解析_云其它
- 2022-07-23 Go語言學習筆記之文件讀寫操作詳解_Golang
- 最近更新
-
- 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同步修改后的遠程分支