1.會話跟蹤技術
我們需要先了解一下什麼是會話!可以把會話理解為客戶端與伺服器之間的一次會晤,在一次會晤中可能會包含多次請求和響應。例如你給10086打個電話,你就是客戶端,而10086服務人員就是伺服器了。從雙方接通電話那一刻起,會話就開始了,到某一方結束通話電話表示會話結束。在通話過程中,你會向10086發出多個請求,那麼這多個請求都在一個會話中。
在JavaWeb中,客戶向某一伺服器發出第一個請求開始,會話就開始了,直到客戶關閉了瀏覽器會話結束。
在一個會話的多個請求中共享資料,這就是會話跟蹤技術。例如在一個會話中的請求如下: 請求銀行主頁;
- 請求登入(請求引數是使用者名稱和密碼);
- 請求轉賬(請求引數與轉賬相關的資料);
- 請求信譽卡還款(請求引數與還款相關的資料)。
在這上會話中當前使用者資訊必須在這個會話中共享的,因為登入的是張三,那麼在轉賬和還款時一定是相對張三的轉賬和還款!這就說明我們必須在一個會話過程中有共享資料的能力。
2.會話路徑技術使用Cookie或者Session完成
http請求是無狀態儲存的,每次的請求都是獨立完成的,無法記錄前一次的請求.但是可以使用cookie來完成會話跟蹤
在web開發中,使用session來完成會話跟蹤,session的底層是依賴cookie技術來完成的.
3.cookie的概述:
Cookie翻譯成中文是小甜點,小餅乾的意思。在HTTP中它表示伺服器送給客戶端瀏覽器的小甜點。其實Cookie是key-value結構,類似於一個python中的字典。隨著伺服器端的響應傳送給客戶端瀏覽器。然後客戶端瀏覽器會把Cookie儲存起來,當下一次再訪問伺服器時把Cookie再傳送給伺服器。 Cookie是由伺服器建立,然後通過響應傳送給客戶端的一個鍵值對。客戶端會儲存Cookie,並會標註出Cookie的來源(哪個伺服器的Cookie)。當客戶端向伺服器發出請求時會把所有這個伺服器Cookie包含在請求中傳送給伺服器,這樣伺服器就可以識別客戶端了!
4.cookie的規範:
1.大小上限為4kb
2.一個伺服器最多在客戶端瀏覽器上儲存20個cookie
3.一個瀏覽器最多可以儲存300個cookie
上面的資料只是HTTP的Cookie規範,但在瀏覽器大戰的今天,一些瀏覽器為了打敗對手,為了展現自己的能力起見,可能對Cookie規範“擴充套件”了一些,例如每個Cookie的大小為8KB,最多可儲存500個Cookie等!但也 不會出現把你硬碟佔滿的可能!
注意,不同瀏覽器之間是不共享Cookie的。也就是說在你使用IE訪問伺服器時,伺服器會把Cookie發給IE,然後由IE儲存起來,當你在使用FireFox訪問伺服器時,不可能把IE儲存的Cookie傳送給伺服器。
4.cookie與http頭
Cookie是通過HTTP請求和響應頭在客戶端和伺服器端傳遞的:
-
- Cookie:請求頭,客戶端傳送給伺服器端;
- 格式:Cookie: a=A; b=B; c=C。即多個Cookie用分號離開; Set-Cookie:響應頭,伺服器端傳送給客戶端;
- 一個Cookie物件一個Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C
5.cokkie的覆蓋
如果伺服器端傳送重複的Cookie那麼會覆蓋原有的Cookie,例如客戶端的第一個請求伺服器端傳送的Cookie是:Set-Cookie: a=A;第二請求伺服器端傳送的是:Set-Cookie: a=AA,那麼客戶端只留下一個Cookie, 即:a=AA
''' class HttpResponseBase: def set_cookie(self, key, 鍵 value='', 值 max_age=None, 超長時間 cookie需要延續的時間(以秒為單位) 如果引數是\ None`` ,這個cookie會延續到瀏覽器關閉為止。 expires=None, 超長時間 expires預設None ,cookie失效的實際日期/時間。 path='/', Cookie生效的路徑, 瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將 cookie傳給站點中的其他的應用。 / 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問 domain=None, Cookie生效的域名 你可用這個引數來構造一個跨站cookie。 如, domain=".example.com" 所構造的cookie對下面這些站點都是可讀的: www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。 如果該引數設定為 None ,cookie只能由設定它的站點讀取。 secure=False, 如果設定為 True ,瀏覽器將通過HTTPS來回傳cookie。 httponly=False 只能http協議傳輸,無法被JavaScript獲取 (不是絕對,底層抓包可以獲取到也可以被覆蓋) ): pass '''
7.獲取cookie:
request.COOKIES
8.刪除cookie
request.delete_cookie("cookie_key,path="/",domain=name")
補充:
cookie的引數相關:
1.max_age=1 cookie的有效時間,單位是秒
2.expires:具體的過期日期
3. salt加密鹽
4.session
Django中預設支援session,其內部提供了5中型別的session供開發者使用.
1.資料庫session
Django預設支援session,並且將session存到資料庫中,即django-session表中
Session是伺服器端技術,利用這個技術,伺服器在執行時可以 為每一個使用者的瀏覽器建立一個其獨享的session物件,由於 session為使用者瀏覽器獨享,所以使用者在訪問伺服器的web資源時 ,可以把各自的資料放在各自的session中,當使用者再去訪問該伺服器中的其它web資源時,其它web資源再從使用者各自的session中 取出資料為使用者服務。
django中session語法
1
2
3
4
5
6
7
8
9
10
|
1 、設定Sessions值 request.session[ 'session_name' ] = "admin" 2 、獲取Sessions值 session_name = request.session[ "session_name" ] 3 、刪除Sessions值 del request.session[ "session_name" ] 4 、flush() 刪除當前的會話資料並刪除會話的Cookie。 這用於確保前面的會話資料不可以再次被使用者的瀏覽器訪問 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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的隨機字串 request.session.session_key # 將所有Session失效日期小於當前日期的資料刪除 request.session.clear_expired() # 檢查 使用者session的隨機字串 在資料庫中是否 request.session.exists( "session_key" ) # 刪除當前使用者的所有Session資料 request.session.delete( "session_key" ) request.session.set_expiry(value) * 如果value是個整數,session會在些秒數後失效。 * 如果value是個datatime或timedelta,session就會在這個時間後失效。 * 如果value是 0 ,使用者關閉瀏覽器session就會失效。 * 如果value是 None ,session會依賴全域性session失效策略。 |
session配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Django預設支援Session,並且預設是將Session資料儲存在資料庫中,即:django_session 表中。 a. 配置 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,預設修改之後才儲存(預設) |
2.快取session
settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的快取別名(預設記憶體快取,也可以是memcache),此處別名依賴快取的設定 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,預設修改之後才儲存
3.檔案session
settings.py配置
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 快取檔案路徑,如果為None,則使用tempfile模組獲取一個臨時地址tempfile.gettempdir() 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T 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
資料庫用作持久化,利用快取提高效率
settings.py配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5.加密cookis和session
settings.py配置
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
補充知識:
什麼是同源?
含義:
最初是指A網頁設定的CookieB網頁是不能打開啟的,除非這兩個網頁同源
同源是指三個相同
協議相同
域名相同
埠相同
目的:
同源政策的目的,是為了保證使用者資訊的安全,防止惡意的網站竊取資料。
同源限制範圍:
(1) Cookie、LocalStorage 和 IndexDB 無法讀取。
(2) DOM 無法獲得。
(3) AJAX 請求不能傳送
有關cookie
Coolie是伺服器寫在瀏覽器中的一段資訊,只有同源的網頁才能共享
舉例來說,A網頁是http://w1.example.com/a.html,B網頁是http://w2.example.com/b.html,那麼只要設定相同的document.domain,兩個網頁就可以共享Cookie。
document.domain = 'example.com';
現在,A網頁通過指令碼設定一個 Cookie。
document.cookie = "test1=hello";
B網頁就可以讀到這個 Cookie。
var allCookie = document.cookie;
注意,這種方法只適用於 Cookie 和 iframe 視窗,LocalStorage 和 IndexDB 無法通過這種方法,規避同源政策,而要使用下文介紹的PostMessage API。
另外,伺服器也可以在設定Cookie的時候,指定Cookie的所屬域名為一級域名,比如.example.com。
Set-Cookie: key=value; domain=.example.com; path=/
這樣的話,二級域名和三級域名不用做任何設定,都可以讀取這個Cookie。