cookie session

Bound_w發表於2018-11-01

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。

相關文章