cookie和session
- cookie:在網(wǎng)站中,http請(qǐng)求是無(wú)狀態(tài)的。也就是說(shuō)即使第一次和服務(wù)器連接后并且登錄成功后泉褐,第二次請(qǐng)求服務(wù)器依然不能知道當(dāng)前請(qǐng)求是哪個(gè)用戶(hù)礼搁。
cookie
的出現(xiàn)就是為了解決這個(gè)問(wèn)題,第一次登錄后服務(wù)器返回一些數(shù)據(jù)(cookie)給瀏覽器,然后瀏覽器保存在本地,當(dāng)該用戶(hù)發(fā)送第二次請(qǐng)求的時(shí)候,就會(huì)自動(dòng)的把上次請(qǐng)求存儲(chǔ)的cookie
數(shù)據(jù)自動(dòng)的攜帶給服務(wù)器炉擅,服務(wù)器通過(guò)瀏覽器攜帶的數(shù)據(jù)就能判斷當(dāng)前用戶(hù)是哪個(gè)了。cookie
存儲(chǔ)的數(shù)據(jù)量有限阳惹,不同的瀏覽器有不同的存儲(chǔ)大小谍失,但一般不超過(guò)4KB。因此使用cookie
只能存儲(chǔ)一些小量的數(shù)據(jù)莹汤。 - session: session和cookie的作用有點(diǎn)類(lèi)似快鱼,都是為了存儲(chǔ)用戶(hù)相關(guān)的信息。不同的是,
cookie
是存儲(chǔ)在本地瀏覽器抹竹,session
是一個(gè)思路线罕、一個(gè)概念、一個(gè)服務(wù)器存儲(chǔ)授權(quán)信息的解決方案窃判,不同的服務(wù)器钞楼,不同的框架,不同的語(yǔ)言有不同的實(shí)現(xiàn)袄琳。雖然實(shí)現(xiàn)不一樣询件,但是他們的目的都是服務(wù)器為了方便存儲(chǔ)數(shù)據(jù)的。session
的出現(xiàn)唆樊,是為了解決cookie
存儲(chǔ)數(shù)據(jù)不安全的問(wèn)題的宛琅。 - cookie和session使用:
web
開(kāi)發(fā)發(fā)展至今,cookie
和session
的使用已經(jīng)出現(xiàn)了一些非常成熟的方案逗旁。在如今的市場(chǎng)或者企業(yè)里嘿辟,一般有兩種存儲(chǔ)方式:- 存儲(chǔ)在服務(wù)端:通過(guò)
cookie
存儲(chǔ)一個(gè)sessionid
,然后具體的數(shù)據(jù)則是保存在session
中片效。如果用戶(hù)已經(jīng)登錄红伦,則服務(wù)器會(huì)在cookie
中保存一個(gè)sessionid
,下次再次請(qǐng)求的時(shí)候堤舒,會(huì)把該sessionid
攜帶上來(lái)色建,服務(wù)器根據(jù)sessionid
在session
庫(kù)中獲取用戶(hù)的session
數(shù)據(jù)。就能知道該用戶(hù)到底是誰(shuí)舌缤,以及之前保存的一些狀態(tài)信息。這種專(zhuān)業(yè)術(shù)語(yǔ)叫做server side session
某残。Django
把session
信息默認(rèn)存儲(chǔ)到數(shù)據(jù)庫(kù)中国撵,當(dāng)然也可以存儲(chǔ)到其他地方,比如緩存(如redis)中玻墅,文件系統(tǒng)中等介牙。存儲(chǔ)在服務(wù)器的數(shù)據(jù)會(huì)更加的安全,不容易被竊取澳厢。但存儲(chǔ)在服務(wù)器也有一定的弊端环础,就是會(huì)占用服務(wù)器的資源,但現(xiàn)在服務(wù)器已經(jīng)發(fā)展至今剩拢,一些session
信息還是綽綽有余的线得。 - 將
session
數(shù)據(jù)加密,然后存儲(chǔ)在cookie
中徐伐。這種專(zhuān)業(yè)術(shù)語(yǔ)叫做client side session
贯钩。django
框架默認(rèn)采用的就是這種方式,但是也可以替換成其他形式。
- 存儲(chǔ)在服務(wù)端:通過(guò)
在django中操作cookie和session:
操作cookie:
設(shè)置cookie:
設(shè)置cookie
是設(shè)置值給瀏覽器的角雷。因此我們需要通過(guò)response
的對(duì)象來(lái)設(shè)置祸穷,設(shè)置cookie
可以通過(guò)response.set_cookie
來(lái)設(shè)置,這個(gè)方法的相關(guān)參數(shù)如下:
-
key
:這個(gè)cookie
的key
勺三。 -
value
:這個(gè)cookie
的value
雷滚。 -
max_age
:最長(zhǎng)的生命周期。單位是秒吗坚。 -
expires
:過(guò)期時(shí)間揭措。跟max_age
是類(lèi)似的,只不過(guò)這個(gè)參數(shù)需要傳遞一個(gè)具體的日期刻蚯,比如datetime
或者是符合日期格式的字符串绊含。如果同時(shí)設(shè)置了expires
和max_age
,那么將會(huì)使用expires
的值作為過(guò)期時(shí)間炊汹。 -
path
:對(duì)域名下哪個(gè)路徑有效躬充。默認(rèn)是對(duì)域名下所有路徑都有效。 -
domain
:針對(duì)哪個(gè)域名有效讨便。默認(rèn)是針對(duì)主域名下都有效充甚,如果只要針對(duì)某個(gè)子域名才有效,那么可以設(shè)置這個(gè)屬性. -
secure
:是否是安全的霸褒,如果設(shè)置為True
伴找,那么只能在https
協(xié)議下才可用。 -
httponly
:默認(rèn)是False
废菱。如果為True
技矮,那么在客戶(hù)端不能通過(guò)JavaScript
進(jìn)行操作。
刪除cookie:
通過(guò)delete_cookie
即可刪除cookie
殊轴。實(shí)際上刪除cookie
就是將指定的cookie
的值設(shè)置為空的字符串衰倦,然后使用將他的過(guò)期時(shí)間設(shè)置為0
,也就是瀏覽器關(guān)閉后就過(guò)期旁理。
獲取cookie:
獲取瀏覽器發(fā)送過(guò)來(lái)的cookie
信息樊零。可以通過(guò)request.COOKIES
來(lái)或者孽文。這個(gè)對(duì)象是一個(gè)字典類(lèi)型驻襟。比如獲取所有的cookie
,那么示例代碼如下:
cookies = request.COOKIES
for cookie_key,cookie_value in cookies.items():
print(cookie_key,cookie_value)
操作session:
django
中的session
默認(rèn)情況下是存儲(chǔ)在服務(wù)器的數(shù)據(jù)庫(kù)中的芋哭,在表中會(huì)根據(jù)sessionid
來(lái)提取指定的session
數(shù)據(jù)沉衣,然后再把這個(gè)sessionid
放到cookie
中發(fā)送給瀏覽器存儲(chǔ),瀏覽器下次在向服務(wù)器發(fā)送請(qǐng)求的時(shí)候會(huì)自動(dòng)的把所有cookie
信息都發(fā)送給服務(wù)器楷掉,服務(wù)器再?gòu)?code>cookie中獲取sessionid
厢蒜,然后再?gòu)臄?shù)據(jù)庫(kù)中獲取session
數(shù)據(jù)霞势。但是我們?cè)诓僮?code>session的時(shí)候,這些細(xì)節(jié)壓根就不用管斑鸦。我們只需要通過(guò)request.session
即可操作愕贡。示例代碼如下:
def index(request):
request.session.get('username')
return HttpResponse('index')
session
常用的方法如下:
-
get
:用來(lái)從session
中獲取指定值。 -
pop
:從session
中刪除一個(gè)值巷屿。 -
keys
:從session
中獲取所有的鍵固以。 -
items
:從session
中獲取所有的值。 -
clear
:清除當(dāng)前這個(gè)用戶(hù)的session
數(shù)據(jù)嘱巾。 -
flush
:刪除session
并且刪除在瀏覽器中存儲(chǔ)的session_id
憨琳,一般在注銷(xiāo)的時(shí)候用得比較多。 -
set_expiry(value)
:設(shè)置過(guò)期時(shí)間旬昭。- 整形:代表秒數(shù)篙螟,表示多少秒后過(guò)期。
-
0
:代表只要瀏覽器關(guān)閉问拘,session
就會(huì)過(guò)期遍略。 -
None
:會(huì)使用全局的session
配置。在settings.py
中可以設(shè)置SESSION_COOKIE_AGE
來(lái)配置全局的過(guò)期時(shí)間骤坐。默認(rèn)是1209600
秒绪杏,也就是2周的時(shí)間。
-
clear_expired
:清除過(guò)期的session
纽绍。Django
并不會(huì)清除過(guò)期的session
蕾久,需要定期手動(dòng)的清理,或者是在終端拌夏,使用命令行python manage.py clearsessions
來(lái)清除過(guò)期的session
僧著。
修改session的存儲(chǔ)機(jī)制:
默認(rèn)情況下,session
數(shù)據(jù)是存儲(chǔ)到數(shù)據(jù)庫(kù)中的辖佣。當(dāng)然也可以將session
數(shù)據(jù)存儲(chǔ)到其他地方霹抛。可以通過(guò)設(shè)置SESSION_ENGINE
來(lái)更改session
的存儲(chǔ)位置卷谈,這個(gè)可以配置為以下幾種方案:
-
django.contrib.sessions.backends.db
:使用數(shù)據(jù)庫(kù)。默認(rèn)就是這種方案霞篡。 -
django.contrib.sessions.backends.file
:使用文件來(lái)存儲(chǔ)session世蔗。 -
django.contrib.sessions.backends.cache
:使用緩存來(lái)存儲(chǔ)session。想要將數(shù)據(jù)存儲(chǔ)到緩存中朗兵,前提是你必須要在settings.py
中配置好CACHES
污淋,并且是需要使用Memcached
或者redis
,而不能使用純內(nèi)存作為緩存余掖。 -
django.contrib.sessions.backends.cached_db
:在存儲(chǔ)數(shù)據(jù)的時(shí)候寸爆,會(huì)將數(shù)據(jù)先存到緩存中,再存到數(shù)據(jù)庫(kù)中。這樣就可以保證萬(wàn)一緩存系統(tǒng)出現(xiàn)問(wèn)題赁豆,session數(shù)據(jù)也不會(huì)丟失仅醇。在獲取數(shù)據(jù)的時(shí)候,會(huì)先從緩存中獲取魔种,如果緩存中沒(méi)有析二,那么就會(huì)從數(shù)據(jù)庫(kù)中獲取。 -
django.contrib.sessions.backends.signed_cookies
:將session
信息加密后存儲(chǔ)到瀏覽器的cookie
中节预。這種方式要注意安全叶摄,建議設(shè)置SESSION_COOKIE_HTTPONLY=True
,那么在瀏覽器中不能通過(guò)js
來(lái)操作session
數(shù)據(jù)安拟,并且還需要對(duì)settings.py
中的SECRET_KEY
進(jìn)行保密蛤吓,因?yàn)橐坏﹦e人知道這個(gè)SECRET_KEY
,那么就可以進(jìn)行解密糠赦。另外還有就是在cookie
中会傲,存儲(chǔ)的數(shù)據(jù)不能超過(guò)4k
。