Web技術3:Cookie與Session
阿新 • • 發佈:2018-12-12
Session與Cookie
Session與Cookie的作用都是為了保持訪問使用者與後端伺服器的互動狀態。各有優點也各有缺點。
Cokkie
當一個使用者通過HTTP訪問一個伺服器時,這個伺服器會講一些key/value鍵值對返回給客戶端瀏覽器
,並給這些資料加行一些限制條件,在條件符合時這個使用者下次訪問這個伺服器時,資料又被完整地呆會給伺服器。這樣伺服器就知道這次請求的一些特殊的資訊了
Cookie(複數形態:Cookies),是指某些網站為了辨別使用者身份、進行session跟蹤
而儲存在使用者本地終端上的資料(通常經過加密)。
Cookie是由服務端生成的,傳送給客戶端(通常是瀏覽器)的。Cookie總是儲存在客戶端中,按在客戶端中的儲存位置,可分為記憶體Cookie和硬碟Cookie
Session
前面介紹了Cookie可以讓服務端程式跟蹤每個客戶端的訪問,但是每次客戶端的訪問都必須回傳這些Cookie,如果Cookie很多,則無形的增加了客戶端與服務端的資料傳輸量,而Session的出現正是為了解決這個問題
同一個客戶端每次與服務點互動時,不需要每次都傳回所有的Cookie值,而你只要傳回一個ID,這個ID是客戶端第一次訪問伺服器時生成的,而且每個客戶端是唯一的。這樣每個客戶端就有了一個唯一ID,客戶端只要傳回這個ID就可以了,這個ID通常是NAME為JSESSIONID的一個Cookie
Cookie工作原理
- 建立Cookie
當用戶第一次瀏覽某個使用Cookie的網站時,該網站的伺服器就進行如下步驟
- 該使用者生成一個
唯一的識別碼,Cookie id
,建立一個Cookie物件 - 預設情況下是一個會話級別的cookie,儲存在瀏覽器的記憶體中,使用者退出瀏覽器之後就被刪除了,如果網站希望瀏覽器將該Cookie儲存在磁碟上,則需要設定最大時效(maxAge),並給出一個以秒為單位的時間(將最大時效設為0則是命令瀏覽器刪除該Cookie)
- 將Cookie放入到HTTP響應報頭,將COokie插入帶一個Set-Cookie HTTP請求報頭中
- 傳送該HTTP響應報頭
- 設定儲存Cookie
- 瀏覽器收到該響應報文後,根據報文頭裡的Set-Cookie特殊的知識,生成相應的Cookie,儲存在客戶端。該Cookie裡面記錄著使用者當前的資訊。
- 傳送Cookie
當用戶再次訪問該網站時,瀏覽器首先檢查所有儲存的Cookies
,如果某個存在該網站的Cookie(即該Cookie所宣告的作用範圍大於等於將要請求的資源),則把該cookie附在請求資源的HTTP請求頭上傳送給伺服器。
- 讀取Cookie
- 伺服器接收到使用者的HTTP請求報文之後,
從報文頭獲取到該使用者的Cookie,從裡面找到所需要的東西。
Cookie作用與缺點
記住密碼,下次自動登入
購物車功能
記錄使用者瀏覽資料,廣告商品推送
缺點
Cookie會被附加在每個HTTP請求中,也會有大小,可以通過壓縮Cookie限制一下,但是還是無形中增加了流量。
由於在HTTP請求中的Cookie是明文傳遞的,所以安全性成問題
。(HTTPS可以避免)當前瀏覽器對Cookie的大小限制基本都在50條左右
。對於複雜的儲存需求來說是不夠用的
Session工作原理
- 建立Session
- 當用戶訪問到一個伺服器,如果伺服器
啟用Session
,伺服器就要為該使用者建立一個SESSION,在建立這個SESSION的時候,伺服器首先檢查這個使用者發來的請求裡是否包含了一個SESSION ID
,如果包含了一個SESSION ID則說明之前該使用者已經登陸過併為此使用者建立過SESSION,那伺服器就按照這個SESSION ID把這個SESSION在伺服器的記憶體中查找出來(如果查詢不到,就有可能為他新建立一個),如果客戶端請求裡不包含有SESSION ID,則為該客戶端建立一個SESSION並生成一個與此SESSION相關的SESSION ID。這個SESSION ID是唯一的、不重複的、不容易找到規律的字串,這個SESSION ID將被在本次響應中返回到客戶端儲存,而儲存這個SESSION ID的正是COOKIE,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識傳送給伺服器。
- Session作用
-
Session的根本作用就是在服務端儲存使用者和伺服器會話的一些資訊。典型的應用有:
1、判斷使用者是否登入
2、購物車功能
Cookie和Session的區別
存放位置不同
,Cookie存放在客戶端(瀏覽器),session存放在伺服器端存取方式不同
,Cookie中只能保管ASCII字串
,假如需求存取Unicode字元或者二進位制資料,需求先進行編碼。Cookie中也不能直接存取Java物件。若要儲存略微複雜的資訊,運用Cookie是比較艱難的。而Session中能夠存取任何型別的資料,包括而不限於String、Integer、List、Map等
。Session中也能夠直接保管Java Bean乃至任何Java類,物件等,運用起來十分便當。能夠把Session看做是一個Java容器類安全性
,`Cookie儲存在瀏覽器中,對客戶端是可見的,客戶端的一些程式可能會窺探、複製以至修正Cookie中的內容。而Session儲存在伺服器上,對客戶端是透明的,不存在敏感資訊洩露的風險。 假如選用Cookie,比較好的方法是,敏感的資訊如賬號密碼等儘量不要寫到Cookie中。最好是像Google、Baidu那樣將Cookie資訊加密,提交到伺服器後再進行解密,保證Cookie中的資訊只要本人能讀得懂。而假如選擇Session就省事多了,反正是放在伺服器上,Session裡任何隱私都能夠有效的保護。跨域支援,Cookie是有域名限制的,也就是在一個域名下的Cookie不能被另一個域名訪問,不同的子域的Cookie是可以共享,比如a.com.index1和a.com.index2是共享的,但是a.com和b.com是不共享的。Session跨子域需要把JESSIONID寫進共享Cookie。也可以在分散式系統中,進行設定session分散式快取:
可以講每臺機器的session同步到一個分散式快取中,那麼使用者通過其他伺服器再次訪問這個應用系統時,就可以拿到session資訊了,對於一些重要的session還可以在Cookie中,如果分散式快取出現問題也不會影響關鍵業務的執行