中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django框架之cookie/session的使用示例(小結)

發布時間:2020-10-08 09:06:28 來源:腳本之家 閱讀:171 作者:zzzzou 欄目:開發技術

一、http協議無狀態問題

http協議沒有提供多次請求之間的關聯功能,協議的本意也并未考慮到多次請求之間的狀態維持,每一次請求都被協議認為是一次性的。但在某些場景下,如一次登錄多次訪問,我們希望可以保存登錄狀態,協議并沒有直接提供會話跟蹤的支持,需要靠其他手段來幫助實現目標。

二、會話跟蹤技術--cookie

1、對cookie的理解

  • cookie是一個key-value的數據結構(類似python字典),用于保存需要維護狀態的數據,cookie與session最大的區別是cookie的數據保存在客戶端,而session把數據保存在服務端。
  • cookie一般由服務器設置,并可以存放在http的請求頭和響應頭中。
  • cookie由瀏覽器保存,瀏覽器已經實現了cookie的保存和發送,而服務器上對cookie的設置和接收則需要我們配置。
  • 通過cookie,可以在多個會話之間共享一些必要的信息如登錄狀態數據、歷史訪問記錄、個性化定制設置等,以實現會話跟蹤,讓用戶感覺到網站可以'記錄'自己的偏好,減少不必要的重復輸入,從而提升用戶體驗。

2、cookie的使用接口

django的服務端發送響應有三種方式:
1. return HttpResponse()
2. return render()
3. return redirect()

這三種方法實例化的結果都是HttpResponse類的實例,可以直接用于設置cookie。

在response對象上執行set_cookie(key,value,...)即可設置cookie, 其中特別注意cookie屬性的設置。

cookie的設置

服務器在響應對象上進行set_cookie操作,一旦設置完成,客戶端后續的請求就可以根據cookie的屬性規則攜帶cookie數據。

def set_cookie(key, value='', max_age=None, expires=None, path='/',
        domain=None, secure=False, httponly=False, samesite=None)

cookie的獲取

服務器在請求對象上通過request.COOKIES得到cookie字典數據,注意此處拿到的cookie數據從安全性來說是未被驗證正確性的。

@cached_property
def COOKIES(self):
  raw_cookie = get_str_from_wsgi(self.environ, 'HTTP_COOKIE', '')
  return parse_cookie(raw_cookie)

注意1:cookie在set的時候可以設置它被發送的范圍,每個cookie都有對應的domain+path的屬性,這約束了cookie發送范圍,只有當http的請求落在此范圍中的url,才會攜帶此cookie。

注意2:一個cookie就是一個key-value項,不過它還攜帶有屬性。一個cookies是一個字典,保存了很多cookie項,注意單個cookie項和整個cookies字典的關系。

3、cookie的屬性

max_age:
失效延遲時間,單位是秒,設置成15秒意味著在設置完之后的15秒之內,此cookie有效,超時之后cookie失效,瀏覽器會刪除失效的cookie。此參數默認是None,代表著直到瀏覽器關閉,即默認是會話cookie。
注意:如果max_age是0,意味著讓瀏覽器立刻刪除此cookie,即此cookie即刻失效。

expires:
指定失效日期,同樣用于失效cookie,只不過是另一種時間指定方式。

domain:
此cookie可以被使用的域名范圍。

path:
與domain配合著使用,默認是根路徑'/',意味著在當前domain范圍下任何url都會攜帶此cookie。可以主動設置其他的路徑以縮小發送的范圍,從而約束某一個cookie項只應用于某些url。

secure:
默認是False,一般配合https協議使用,在https協議下,只有secure屬性是True的cookie才允許被發送。

httponly:
默認是False,這意味著js也可以通過document.cookie來訪問和設置此cookie,而如果設置為True,則代表只允許服務端來訪問和設置此cookie。

4、使用cookie的問題

cookie的安全性問題

服務器是根據客戶端發送過來的cookie進行狀態判斷,這種保存在客戶端的cookie數據非常容易修改和偽裝,服務器基本無法知曉cookie的正確性,也就不能100%信任cookie的數據。

此外,cookie很容易被盜取,如果客戶端cookie里面包含私密數據的話,就更不安全了。

cookie的覆蓋問題

在服務端上設置的新的cookie會讓客戶端更新本地cookie。

cookie的合理性問題

什么樣的數據適合放到cookie中?

cookie中的數據是每次交互都要被傳輸的,所以我認為:

  • 應該是常用的數據,如果不常用只會浪費帶寬減少效率,最好是多次交互中都要使用或者修改
  • 應該是小數據量
  • 不應該是非常私密的數據,否則:要么在客戶端上容易被盜取,要么在傳輸中容易被截取

所以cookie特別適合發送sessionid,它能滿足上述所有條件。

cookie的存儲問題

cookie是客戶端臨時存儲,按規定單個cookie文件存儲量最大是4kb,每個域下的cookie文件不能超過20個,不應該將cookie作為存儲功能的濫用,要使用客戶端存儲功能應該啟用localstorage。

cookie的訪問限制問題

js的document.cookie可以獲取cookie數據,將會在控制臺輸出一個字符串格式的key-value數據,如果此cookie的屬性是httponly=true就不能通過此方法獲取。

三、會話跟蹤技術--session

1、對session的理解

session把數據存放在服務器上,并使用一個標簽session-key唯一標記此數據。session-key作為cookie發送給客戶端,即客戶端只保存session-key,然后通過cookie發送給服務端,以表明身份,所以session比cookie安全。

每一次請求到達服務器的時候,服務器獲取cookie中保存的session-key,并在數據庫django-session表中尋找對應的session-data,進一步處理業務邏輯。

session的使用有如下優點:
1、數據保存在服務端,客戶端僅保存一個senssionid
 2、sessionid數據量很小,適合每次發送
3、安全性,sessionid是一個隨機字符串,不攜帶任何私密數據

2、session的使用接口

session的設置

django實現了session,幫我們完成了很多操作,且提供使用的接口非常簡單:

request.session['name'] = 'xxx'

設置session的時候會執行如下三個操作:
1、創建一個隨機字符串作為sessionid
2、把sessionid作為session-key,以及一個session_data字典加入到django-session表中
3、set-cookie,把sessionid發送給客戶端

注意1:從底層源碼來看,session_data其實就是一個字典{},然后通過orm存到django_session表中(應該有dict-->str的序列化和加密操作)

注意2:如果發現客戶端的cookie中含有seesionid說明不是第一次登錄,將會使用此sessionid并更新此sessionid對應的session_data數據

注意3:如果有兩個用戶在同一臺電腦的同一個瀏覽器上,訪問同一個url,因為sessionid是作為cookie存在,所以兩個人會使用同一個sessionid。

而對于服務器而言,只認sessionid不認人,使用同一個sessionid的操作會覆蓋之前的數據以導致在服務端上的session_data數據會相互覆蓋,這樣的結果是數據紊亂(尤其當兩人的數據項目數量不一致時更嚴重)

session的讀取

讀取session的接口同樣很簡單:

name = request.session['name']

讀取的時候會執行如下三個操作:
1、獲取request.COOKIES中的sessionid
2、拿著sessionid作為session_key到數據庫的django-session表中查找對應的session-data,底層就是執行orm的objects.filter(session_key=sessionid)
3、獲取session-data中的數據并進一步處理

session的刪除

刪除session的接口:
1、del request.session[xxx]   # 刪除一個會話數據屬性
2、request.session.flush()    # 刪除所有會話數據

清空會話信息時會執行如下操作:
1、刪除django-session表中的session-key=sessionid的記錄,底層操作就是執行orm的objects.filter(session_key=sessionid).delete()
2、刪除response中的cookie里的sessionid記錄

注意1:服務器把sessionid作為cookie的數據發給客戶端保存,一般是會話cookie即不關閉瀏覽器程序就可以一直保持會話跟蹤。但一旦客戶端關閉了瀏覽器,則此sessionid便不再有效。但django頒發的cookie默認有效時間是2周,所以cookie會被保存到客戶端硬盤上,即使關閉了瀏覽器也繼續保存。

注意2:因為服務器無法獲知客戶端瀏覽器將會在什么時候關閉,更無法獲知瀏覽器什么時候會執行清空cookie的操作。客戶端一般只有在logout的時候才會主動告知刪除session,其他情況下瀏覽器不會主動告知,所以服務器的session不能無限保存,被迫要設置失效時間(不然存儲空間浪費),在一定時間內如果還沒有用戶重新訪問此session,便被服務端認為此用戶已失效,進而可以刪除session數據。

3、session的屬性

settings中還可以配置全局的session屬性:

# settings.py文件

  SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(默認)
  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 = 1209600               # Session的cookie失效日期(2周)(默認)
  SESSION_EXPIRE_AT_BROWSER_CLOSE = False         # 是否關閉瀏覽器使得Session過期(默認)
  SESSION_SAVE_EVERY_REQUEST = False            # 是否每次請求都保存Session,默認修改之后才保存(默認)

4、使用session的問題

1、session的正常工作依賴于cookie的啟用,如果客戶端禁用cookie功能,該如何保證session正常工作?---重寫URL

2、同一臺電腦同一個瀏覽器,訪問同一個url,保存著同一個sessionid,如何處理多用戶使用同一sessionid登錄而導致的數據紊亂問題?---使用用戶認證組件,使用賬戶密碼來區別用戶

四、總結

1、cookie和session都是為了解決http協議自身并不支持狀態維持的缺點。
2、會話跟蹤的目的是為了讓多次請求之間可以共享數據,以提供更好的用戶體驗。
3、cookie和session都需要保存狀態維持數據,只不過cookie是保存在客戶端,session是保存在服務端。
4、分析和研究兩者的技術相同點和區別有助于加深對會話跟蹤的理解和使用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

伊金霍洛旗| 新龙县| 汾阳市| 海门市| 古丈县| 大姚县| 石渠县| 金堂县| 宣城市| 鹤庆县| 昌乐县| 安丘市| 绍兴县| 简阳市| 集贤县| 石景山区| 界首市| 襄汾县| 崇义县| 晋宁县| 土默特右旗| 清丰县| 九龙坡区| 察雅县| 镇沅| 密云县| 正镶白旗| 吉木乃县| 泊头市| 旌德县| 宁波市| 瑞金市| 卢湾区| 调兵山市| 辽源市| 清原| 道孚县| 南康市| 开阳县| 潢川县| 保定市|