django——会话追踪技术
1.引言
1.1什么是會話追蹤技術(shù)
會話是指一個終端用戶(服務(wù)器)與交互系統(tǒng)(客戶端)進(jìn)行通訊的過程。
1.2 什么是會話跟蹤
對同一個用戶對服務(wù)器的連續(xù)的請求和接受響應(yīng)的監(jiān)視。(將用戶與同一用戶發(fā)出的不同請求之間關(guān)聯(lián),為了數(shù)據(jù)共享)
1.3 為什么需要會話跟蹤
瀏覽器與服務(wù)器之間的通信是通過HTTP協(xié)議進(jìn)行通信的,而HTTP協(xié)議是”無狀態(tài)”的協(xié)議,它不能保存客戶的信息,即一次響應(yīng)完成之后連接就斷開了,下一次的請求需要重新連接,這樣一些用戶的狀態(tài)信息就無法留存下來(如用戶已登錄,下次不必再次彈出登錄界面),==會話跟蹤技術(shù)==正是來實現(xiàn)這種要求的。
1.4 四種會話跟蹤技術(shù)
Cookie:
Cookie是Web服務(wù)器發(fā)送給客戶端的一小段信息,客戶端請求時可以讀取該信息發(fā)送到服務(wù)器端,進(jìn)而進(jìn)行用戶的識別。對于客戶端的每次請求,服務(wù)器都會將Cookie發(fā)送到客戶端,在客戶端可以進(jìn)行保存,以便下次使用。 服務(wù)器創(chuàng)建保存于瀏覽器端,不可跨域名性,大小及數(shù)量有限。客戶端可以采用兩種方式來保存這個Cookie對象,一種方式是 保存在 客戶端內(nèi)存中,稱為臨時Cookie,瀏覽器關(guān)閉后 這個Cookie對象將消失。另外一種方式是保存在 客戶機(jī)的磁盤上,稱為永久Cookie。以后客戶端只要訪問該網(wǎng)站,就會將這個Cookie再次發(fā)送到服務(wù)器上,前提是 這個Cookie在有效期內(nèi)。 這樣就實現(xiàn)了對客戶的跟蹤。
Cookie是可以被禁止的。
session:
每一個用戶都有一個不同的session,各個用戶之間是不能共享的,是每個用戶所獨享的,在session中可以存放信息。?保存在服務(wù)器端。需要解決多臺服務(wù)器間共享問題。如果Session內(nèi)容過于復(fù)雜,當(dāng)大量客戶訪問服務(wù)器時可能會導(dǎo)致內(nèi)存溢出。因此,Session里的信息應(yīng)該盡量精簡。? 在服務(wù)器端會創(chuàng)建一個session對象,產(chǎn)生一個sessionID來標(biāo)識這個session對象,然后將這個sessionID放入到Cookie中發(fā)送到客戶端,下一次訪問時,sessionID會發(fā)送到服務(wù)器,在服務(wù)器端進(jìn)行識別不同的用戶。
Session是依賴Cookie的,如果Cookie被禁用,那么session也將失效。
URL重寫:
URL(統(tǒng)一資源定位符)是Web上特定頁面的地址,URL地址重寫的原理是將該用戶Session的id信息重寫 到URL地址中,以便在服務(wù)器端進(jìn)行識別不同的用戶。URL重寫能夠在客戶端停用cookies或者不支持cookies的時候仍然能夠發(fā)揮作用。
隱藏表單域:
將會話ID添加到HTML表單元素中提交到服務(wù)器,此表單元素并不在客戶端顯示,瀏覽時看不到,源代碼中有。
1.5 Session和Cookie區(qū)別:
應(yīng)用場景:
記住賬號密碼一般在cookie中,購物車的實現(xiàn)一般也是cookie。
私人信息及登陸驗證信息在session中。
2.Cookie概述
2.1 Django與Cookie
Cookie翻譯成中文是小甜點,小餅干的意思。在HTTP中它表示服務(wù)器送給客戶端瀏覽器的小甜點。
Cookie是key-value結(jié)構(gòu),類似于一個python中的字典。
隨著服務(wù)器端的響應(yīng)發(fā)送給客戶端瀏覽器。然后客戶端瀏覽器會把Cookie保存起來,當(dāng)下一次再訪問服務(wù)器時把Cookie再發(fā)送給服務(wù)器。 Cookie是由服務(wù)器創(chuàng)建,然后通過響應(yīng)發(fā)送給客戶端的一個鍵值對。客戶端會保存Cookie,并會標(biāo)注出Cookie的來源(哪個服務(wù)器的Cookie)。當(dāng)客戶端向服務(wù)器發(fā)出請求時會把所有這個服務(wù)器Cookie包含在請求中發(fā)送給服務(wù)器,這樣服務(wù)器就可以識別客戶端了!
2.1.1Cookie規(guī)范
- Cookie大小上限為4KB;
- 一個服務(wù)器最多在客戶端瀏覽器上保存20個Cookie;
- 一個瀏覽器最多保存300個Cookie;
上面的數(shù)據(jù)只是HTTP的Cookie規(guī)范,但在瀏覽器大戰(zhàn)的今天,一些瀏覽器為了打敗對手,為了展現(xiàn)自己的能力起見,可能對Cookie規(guī)范“擴(kuò)展”了一些,例如每個Cookie的大小為8KB,最多可保存500個Cookie等!但也不會出現(xiàn)把你硬盤占滿的可能!
注意,不同瀏覽器之間是不共享Cookie的。也就是說在你使用IE訪問服務(wù)器時,服務(wù)器會把Cookie發(fā)給IE,然后由IE保存起來,當(dāng)你在使用FireFox訪問服務(wù)器時,不可能把IE保存的Cookie發(fā)送給服務(wù)器。
2.1.2Cookie與HTTP頭
Cookie是通過HTTP請求和響應(yīng)頭在客戶端和服務(wù)器端傳遞的:
- Cookie:請求頭,客戶端發(fā)送給服務(wù)器端;
- 格式:Cookie: a=A; b=B; c=C。即多個Cookie用分號離開; ? Set-Cookie:響應(yīng)頭,服務(wù)器端發(fā)送給客戶端;
- 一個Cookie對象一個Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C
2.1.3 Cookie的覆蓋
如果服務(wù)器端發(fā)送重復(fù)的Cookie那么會覆蓋原有的Cookie,例如客戶端的第一個請求服務(wù)器端發(fā)送的Cookie是:Set-Cookie: a=A;第二請求服務(wù)器端發(fā)送的是:Set-Cookie: a=AA,那么客戶端只留下一個Cookie,即:a=AA。
2.2 django中的cookie語法
設(shè)置cookie:
rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect() rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密鹽',...)源碼:
class HttpResponseBase:def set_cookie(self, key, 鍵value='', 值max_age=None, 超長時間cookie需要延續(xù)的時間(以秒為單位)如果參數(shù)是\ None`` ,這個cookie會延續(xù)到瀏覽器關(guān)閉為止。expires=None, 超長時間expires默認(rèn)None ,cookie失效的實際日期/時間。path='/', Cookie生效的路徑,瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將cookie傳給站點中的其他的應(yīng)用。/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問domain=None, Cookie生效的域名你可用這個參數(shù)來構(gòu)造一個跨站cookie。如, domain=".example.com"所構(gòu)造的cookie對下面這些站點都是可讀的:www.example.com 、 www2.example.com和an.other.sub.domain.example.com 。如果該參數(shù)設(shè)置為 None ,cookie只能由設(shè)置它的站點讀取。secure=False, 如果設(shè)置為 True ,瀏覽器將通過HTTPS來回傳cookie。httponly=False 只能http協(xié)議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)): pass獲取cookie:
request.COOKIES刪除cookie:
response.delete_cookie("cookie_key",path="/",domain=name)練習(xí)
案例1:顯示上次訪問時間。
案例2:顯示上次瀏覽過的商品。
3 session
3.1 Django與Cookie
Session是服務(wù)器端技術(shù),利用這個技術(shù),服務(wù)器在運行時可以 為每一個用戶的瀏覽器創(chuàng)建一個其獨享的session對象,由于 session為用戶瀏覽器獨享,所以用戶在訪問服務(wù)器的web資源時 ,可以把各自的數(shù)據(jù)放在各自的session中,當(dāng)用戶再去訪問該服務(wù)器中的其它web資源時,其它web資源再從用戶各自的session中 取出數(shù)據(jù)為用戶服務(wù)。
3.2 django中session語法
1、設(shè)置Sessions值request.session['session_name'] ="admin" 2、獲取Sessions值session_name = request.session["session_name"] 3、刪除Sessions值del request.session["session_name"] 4、flush()刪除當(dāng)前的會話數(shù)據(jù)并刪除會話的Cookie。這用于確保前面的會話數(shù)據(jù)不可以再次被用戶的瀏覽器訪問 5、get(key, default=None)fav_color = request.session.get('fav_color', 'red') 6、pop(key)fav_color = request.session.pop('fav_color') 7、keys() 8、items() 9、setdefault() 10 用戶session的隨機(jī)字符串request.session.session_key# 將所有Session失效日期小于當(dāng)前日期的數(shù)據(jù)刪除request.session.clear_expired()# 檢查 用戶session的隨機(jī)字符串 在數(shù)據(jù)庫中是否request.session.exists("session_key")# 刪除當(dāng)前用戶的所有Session數(shù)據(jù)request.session.delete("session_key")request.session.set_expiry(value)* 如果value是個整數(shù),session會在些秒數(shù)后失效。* 如果value是個datatime或timedelta,session就會在這個時間后失效。* 如果value是0,用戶關(guān)閉瀏覽器session就會失效。* 如果value是None,session會依賴全局session失效策略。session配置
Django默認(rèn)支持Session,并且默認(rèn)是將Session數(shù)據(jù)存儲在數(shù)據(jù)庫中,即:django_session 表中。a. 配置 settings.pySESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認(rèn))SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機(jī)字符串(默認(rèn))SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認(rèn))SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認(rèn))SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認(rèn))SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認(rèn))SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認(rèn))SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過期(默認(rèn))SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認(rèn)修改之后才保存(默認(rèn))練習(xí)
1 登錄案例
思考,如果第二個人再次再同一個瀏覽器上登錄,django-session表會怎樣?
2 驗證碼案例
驗證碼可以去識別發(fā)出請求的是人還是程序!當(dāng)然,如果聰明的程序可以去分析驗證碼圖片!但分析圖片也不是一件容易的事,因為一般驗證碼圖片都會帶有干擾線,人都看不清,那么程序一定分析不出來。
轉(zhuǎn)載于:https://www.cnblogs.com/huang-yc/p/9545091.html
總結(jié)
以上是生活随笔為你收集整理的django——会话追踪技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贷款余额是指什么意思 需要归还的钱
- 下一篇: 鸡毛信借款多久放款