cookie和session


一 cookie 和 session

1、cookie:在網站中,http請求是無狀態的。也就是說即使第一次和服務器連接后並且登錄成功后,第二次請求服務器依然不能知道當前請求是哪個用戶。cookie的出現就是為了解決這個問題,第一次登錄后服務器返回一些數據(cookie)給瀏覽器,然后瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是哪個了。cookie存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB。因此使用cookie只能存儲一些小量的數據。

2、session: session和cookie的作用有點類似,都是為了存儲用戶相關的信息。不同的是,cookie是存儲在本地瀏覽器session是一個思路、一個概念、一個服務器存儲授權信息的解決方案,不同的服務器,不同的框架,不同的語言有不同的實現。雖然實現不一樣,但是他們的目的都是服務器為了方便存儲數據的。session的出現,是為了解決cookie存儲數據不安全的問題的。

3、cookie和session使用:web開發發展至今,cookiesession的使用已經出現了一些非常成熟的方案。在如今的市場或者企業里,一般有兩種存儲方式:

  • 存儲在服務端:通過cookie存儲一個sessionid,然后具體的數據則是保存在session中。如果用戶已經登錄,則服務器會在cookie中保存一個sessionid,下次再次請求的時候,會把該sessionid攜帶上來,服務器根據sessionidsession庫中獲取用戶的session數據。就能知道該用戶到底是誰,以及之前保存的一些狀態信息。這種專業術語叫做server side sessionDjangosession信息默認存儲到數據庫中,當然也可以存儲到其他地方,比如緩存中,文件系統中等。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有一定的弊端,就是會占用服務器的資源,但現在服務器已經發展至今,一些session信息還是綽綽有余的。
  • session數據加密,然后存儲在cookie。這種專業術語叫做client side sessionflask框架默認采用的就是這種方式,但是也可以替換成其他形式。

 

二 在django中操作cookie和session

2-1 操作cookie

1)設置cookie

  設置cookie是設置值給瀏覽器的。因此我們需要通過response的對象來設置,設置cookie可以通過response.set_cookie來設置,這個方法的相關參數如下:

  1. key:這個cookiekey
  2. value:這個cookievalue。
  3. max_age:最長的生命周期。單位是秒。
  4. expires:過期時間。跟max_age是類似的,只不過這個參數需要傳遞一個具體的日期,比如datetime或者是符合日期格式的字符串。如果同時設置了expiresmax_age,那么將會使用expires的值作為過期時間。
  5. path:對域名下哪個路徑有效。默認是對域名下所有路徑都有效。
  6. domain:針對哪個域名有效。默認是針對主域名下都有效,如果只要針對某個子域名才有效,那么可以設置這個屬性。
  7. secure:是否是安全的,如果設置為True,那么只能在https協議下才可用。
  8. httponly:默認是False。如果為True,那么在客戶端不能通過JavaScript進行操作。

2)刪除cookie

  通過delete_cookie即可刪除cookie。實際上刪除cookie就是將指定的cookie的值設置為空的字符串,然后使用將他的過期時間設置為0,也就是瀏覽器關閉后就過期

3)獲取cookie

  獲取瀏覽器發送過來的cookie信息。可以通過request.COOKIES來或者。這個對象是一個字典類型。比如獲取所有的cookie,那么示例代碼如下

cookies = request.COOKIES
for cookie_key,cookie_value in cookies.items():
   print(cookie_key,cookie_value)

4)操作cookie

  django中的session默認情況下是存儲在服務器的數據庫中的,在表中會根據sessionid來提取指定的session數據,然后再把這個sessionid放到cookie中發送給瀏覽器存儲,瀏覽器下次在向服務器發送請求的時候會自動的把所有cookie信息都發送給服務器,服務器再從cookie中獲取sessionid,然后再從數據庫中獲取session數據。但是我們在操作session的時候,這些細節壓根就不用管。我們只需要通過request.session即可操作。示例代碼如下:

def index(request):
   request.session.get('username')
   return HttpResponse('index')

  session常用的方法如下:

  1. get:用來從session中獲取指定值。
  2. pop:從session中刪除一個值。
  3. keys:從session中獲取所有的鍵。
  4. items:從session中獲取所有的值。
  5. clear:清除當前這個用戶的session數據。
  6. flush:刪除session並且刪除在瀏覽器中存儲的session_id,一般在注銷的時候用得比較多。
  7. set_expiry(value):設置過期時間。
    • 整形:代表秒數,表示多少秒后過期。
    • 0:代表只要瀏覽器關閉,session就會過期。
    • None:會使用全局的session配置。在settings.py中可以設置SESSION_COOKIE_AGE來配置全局的過期時間。默認是1209600秒,也就是2周的時間。

    8. clear_expired:清除過期的sessionDjango並不會清除過期的session,需要定期                 手動的清理,或者是在終端,使用命令行python manage.py clearsessions來清除                    過期的session。

5)修改session的存儲機制

  默認情況下,session數據是存儲到數據庫中的。當然也可以將session數據存儲到其他地方。可以通過設置SESSION_ENGINE來更改session的存儲位置,這個可以配置為以下幾種方案:

  1. django.contrib.sessions.backends.db:使用數據庫。默認就是這種方案。
  2. django.contrib.sessions.backends.file:使用文件來存儲session。
  3. django.contrib.sessions.backends.cache:使用緩存來存儲session。想要將數據存儲到緩存中,前提是你必須要在settings.py中配置好CACHES,並且是需要使用Memcached,而不能使用純內存作為緩存。
  4. django.contrib.sessions.backends.cached_db:在存儲數據的時候,會將數據先存到緩存中,再存到數據庫中。這樣就可以保證萬一緩存系統出現問題,session數據也不會丟失。在獲取數據的時候,會先從緩存中獲取,如果緩存中沒有,那么就會從數據庫中獲取。
  5. django.contrib.sessions.backends.signed_cookies:將session信息加密后存儲到瀏覽器的cookie中。這種方式要注意安全,建議設置SESSION_COOKIE_HTTPONLY=True,那么在瀏覽器中不能通過js來操作session數據,並且還需要對settings.py中的SECRET_KEY進行保密,因為一旦別人知道這個SECRET_KEY,那么就可以進行解密。另外還有就是在cookie中,存儲的數據不能超過4k。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM