最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

全部開發(fā)者教程

Django 入門教程

課程導(dǎo)學(xué)
Django 慕課教程使用指南
Django開發(fā)實戰(zhàn)
35 開發(fā)實戰(zhàn)

Session 和 Cookie 的概念

現(xiàn)在正式進入第四部分學(xué)習(xí),作為開頭部分,我們首先要介紹下 Web 框架中常用到的 Cookie 和 Session 的概念。在了解了這些基礎(chǔ)知識后,我們就可以學(xué)習(xí) Django 中是如何使用 Cookie 和 Session 幫我們完成一些簡單的必要功能。話不多說,現(xiàn)在就開始吧!

1. 為什么需要Cookie和Session?

在 Web 程序中,對會話的跟蹤是很一件非常重要的事情。通常,一個用戶的所有請求操作都應(yīng)該屬于同一個會話,而另一個用戶的所有請求操作則應(yīng)該屬于另一個會話,二者不能互不干擾。然而大部分的 Web 應(yīng)用程序都是使用HTTP 協(xié)議傳輸數(shù)據(jù)的。HTTP協(xié)議是無狀態(tài)的協(xié)議。一旦數(shù)據(jù)交換完畢,客戶端與服務(wù)器端的連接就會關(guān)閉,再次交換數(shù)據(jù)需要建立新的連接。這就意味著服務(wù)器無法從連接上跟蹤會話。如果 Web 服務(wù)上沒有這種的會話追蹤功能,那么大部分網(wǎng)站都會陷入一片混亂。特別是對于電商網(wǎng)站而言,如果我添加一次購物車就需要登錄一次確認(rèn)身份,那對于用戶體驗而言是糟糕透的。會話(Session)跟蹤是 Web 程序中常用的技術(shù),用來跟蹤用戶的整個會話。常用的會話跟蹤技術(shù)是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份Session通過在服務(wù)器端記錄信息確定用戶身份。正是有了 Cookie 和 Session 這樣的會話跟蹤技術(shù),彌補了 HTTP 協(xié)議無狀態(tài)的不足,才使得我們可以無差別的訪問網(wǎng)站,即只需要一次登錄,后續(xù)所有的操作通過 Cookie 或者 Session 便能自動識別為該用戶,并維持在一個會話中。

2.1 什么是Cookie?

前面已經(jīng)介紹了,Cookie 是一種會話跟蹤技術(shù),且將用戶信息記錄在客戶端,通常是我們自己電腦上的某個位置,這個位置是固定的,和使用的瀏覽器有關(guān)。目前Cookie已經(jīng)成為標(biāo)準(zhǔn),所有的主流瀏覽器如 IE、Netscape、Firefox、Opera 以及 Chrome 等都是支持 Cookie 的。

Cookie 實際上是一小段的文本信息。客戶端請求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就使用response向客戶端瀏覽器頒發(fā)一個 Cookie??蛻舳藶g覽器會把 Cookie 保存起來。當(dāng)瀏覽器再請求該網(wǎng)站時,瀏覽器把請求的網(wǎng)址連同該 Cookie 一同提交給服務(wù)器。服務(wù)器檢查該 Cookie,以此來辨認(rèn)用戶狀態(tài)。服務(wù)器還可以根據(jù)需要修改 Cookie 的內(nèi)容。

現(xiàn)在我們訪問下慕課網(wǎng),然后進行登錄,登錄之后我們所有在慕課網(wǎng)中的操作都會帶上這個 Cookie 去請求后端服務(wù),這樣后端服務(wù)通過 Cookie 就能識別請求的用戶。參考下面兩個圖,第二個是 Cookie 的真實位置,它是放到請求頭部中的,具體內(nèi)容是用逗號分隔的 key=value 形式。

圖片描述

圖片描述

此外, 我們在前端調(diào)試工具頁面中選擇 Console Tab 頁面,輸入一行 js 代碼就能拿到對方網(wǎng)站發(fā)給我們的 cookie值:

圖片描述

2.2 Cookie的特點

Cookie 有如下特點:

不可跨域名性

這個是 Cookie 非常重要的一個特點,域名限制。表示 A 網(wǎng)站頒發(fā)的 Cookie 在用戶訪問 B 網(wǎng)站時并不會被提交到 B 網(wǎng)站上去,這些都是由 Cookie 規(guī)范確定。此外,W3C 標(biāo)準(zhǔn)還禁止了 JavaScript 讀寫任何不屬于自己網(wǎng)站的 Cookie;

時間限制

Cookie 同樣有著自己的生命周期,其 maxAge 值決定著 Cookie 的有效期,單位為秒。如果maxAge 屬性為正,則表示該 Cookie 會在 maxAge 秒之后自動失效。瀏覽器會將 maxAge 為正數(shù)的 Cookie持久化,即寫到對應(yīng)的 Cookie 文件中。無論客戶關(guān)閉了瀏覽器還是電腦,只要還在 maxAge 秒之前,登錄網(wǎng)站時該 Cookie 仍然有效;如果 maxAge 為負(fù)數(shù),則表示該 Cookie 僅在本瀏覽器窗口以及本窗口打開的子窗口內(nèi)有效,關(guān)閉窗口后該 Cookie 即失效。maxAge 為負(fù)數(shù)的 Cookie,為臨時性 Cookie,不會被持久化,不會被寫到 Cookie 文件中。Cookie 信息保存在瀏覽器內(nèi)存中,因此關(guān)閉瀏覽器該 Cookie 就消失了。Cookie 默認(rèn)的 maxAge 值為–1;而如果 maxAge 為0,則表示刪除該 Cookie。Cookie 機制沒有提供刪除 Cookie 的方法,因此通過設(shè)置該 Cookie 即時失效實現(xiàn)刪除 Cookie 的效果。失效的 Cookie 會被瀏覽器從 Cookie 文件或者內(nèi)存中刪除;

  • 空間限制:Cookie 只能存儲4-10KB;
  • 數(shù)量限制:一般而言,每個域下最多不能超過50個 Cookie
  • 存儲數(shù)據(jù)類型限制:Cookie只能存儲字符串

從上面這些特點,我們也能發(fā)現(xiàn)使用 Cookie 的一些缺點。使用 Cookie 最大的問題就是安全性,因為 Cookie 是保存在客戶端的,且每次發(fā)送 HTTP 請求都會將 Cookie 帶過去。這些都導(dǎo)致 Cookie 很容易泄露出去,如果一旦 Cookie 泄露,且 Cookie 中設(shè)置的時間較長,那么很可能攻擊者拿著這個 Cookie 就能冒充受害者的身份去做一些事情,最后留下的記錄都是受害者的。然而接下來的 Session 在某種程度上避免了這一類的問題。

3. Session

3.1 什么是Session?

Session 是另一種記錄客戶狀態(tài)的機制,不同于 Cookie 保存在客戶端瀏覽器中,Session 數(shù)據(jù)時保存在服務(wù)器上。瀏覽器訪問服務(wù)器的時,服務(wù)器會把客戶端信息以某種形式記錄在服務(wù)器上,這些數(shù)據(jù)就是 Session??蛻舳藶g覽器再次訪問時只需要從該 Session 中查找該客戶的狀態(tài)就可以了。

Cookie 機制是通過檢查客戶身上的“通行證”來確定客戶身份,Session 機制是通過檢查服務(wù)器上的“客戶明細(xì)表”來確認(rèn)客戶身份。Session 相當(dāng)于程序在服務(wù)器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。

當(dāng)多個客戶端執(zhí)行程序時,服務(wù)器會保存多個客戶端的 Session。獲取 Session 的時候也不需要聲明獲取誰的Session。Session 機制決定了當(dāng)前客戶只會獲取到自己的 Session,而不會獲取到別人的 Session。各客戶的Session 也彼此獨立,互不可見

Session 的使用雖然比 Cookie 方便許多,但是過多的 Session 存儲在服務(wù)器內(nèi)存中,會對服務(wù)器造成壓力。

3.2 Session的生命周期

這里我們談?wù)?Session 的生命周期,和 Cookie 有所不同。首先 Session 保存在服務(wù)器端,為了獲得更高的存取速度,服務(wù)器一般把Session放在內(nèi)存里。Session 會在用戶第一次訪問服務(wù)器的時候自動創(chuàng)建。Session 生成后,只要用戶繼續(xù)訪問,服務(wù)器就會更新 Session 的最后訪問時間,并維護該 Session。用戶每訪問服務(wù)器一次,無論是否讀寫 Session,服務(wù)器都認(rèn)為該用戶的 Session “活躍”了一次。

由于會有越來越多的用戶訪問服務(wù)器,因此 Session 也會越來越多。為防止內(nèi)存溢出,服務(wù)器會把長時間內(nèi)沒有活躍的 Session 從內(nèi)存刪除。這個時間就是 Session 的超時時間。如果超過了超時時間沒訪問過服務(wù)器,Session 就自動失效了。

介紹完了 Cookie 和 Session 之后,我們現(xiàn)在來看看二者的區(qū)別,當(dāng)然最大的區(qū)別前面已經(jīng)反復(fù)強調(diào)過了:

  • Cookie 數(shù)據(jù)存放在客戶的瀏覽器上,Session 數(shù)據(jù)放在服務(wù)器上;
  • 上面的區(qū)別也導(dǎo)致了 Cookie 和 Session 之間安全性的差別。Cookie 數(shù)據(jù)保存在用戶端,數(shù)據(jù)容易被竊取,不太安全。雖然對 Cookie 中的敏感信息加密可以暫時規(guī)避安全風(fēng)險,但即使加密數(shù)據(jù)被泄露了總歸是不好的;Session 數(shù)據(jù)存儲在服務(wù)器,可以有效規(guī)避信息泄露問題;
  • Cookie 和 Session 之間生命周期不同,具體可以看前面兩個的介紹;
  • 單個 Cookie 保存的數(shù)據(jù)不能超過4K,很多瀏覽器都會限制一個站點最多保存20個 Cookie,且只能保存字符串內(nèi)容;對于 Session 則沒多少限制,Session 可以保存復(fù)雜的數(shù)據(jù)類型,而且數(shù)量沒有限制,主要是訪問用戶太多后,容易造成服務(wù)器內(nèi)存溢出。

4. 小結(jié)

本小節(jié)中我們詳細(xì)介紹了 Cookie 和 Session 中的一些基本概念以及各自的優(yōu)缺點。在了解了這些基礎(chǔ)知識后,我們就可以在 Django 中操作 Cookie 和 Session 了。