cookie、session、sessionStorage和localStorage

摘抄並整理後查web

 

cookie 和 session 通常用來跟蹤瀏覽器的用戶身份ajax

 

Session的存儲方式數據庫

  1. 使用cookie:保存 session id 的方式能夠採用 cookie,這樣在交互過程當中瀏覽器能夠自動的把 JSESSIONID 發給服務器。瀏覽器

  若是客戶端請求的 cookie 中不包含 JSESSIONID,服務端調用request.getSession() 時就會生成並傳遞給客戶端,這次響應頭會包含設置 cookie 的信息,若是客戶端請求的 cookie 中包含 JSESSIONID,服務端調用 request.getSession() 時就會根據 JSESSIONID 進行查找對象,若是能查找到返回,不然就跟沒傳遞 JSESSIONID 同樣,從新生成。不管是直接瀏覽 url 仍是 ajax 請求都會在客戶端 cookie 生成 JSESSIONID。緩存

 

  2. URL重寫:因爲 cookie 能夠被認爲的禁用,必須有其餘的機制以便在 cookie 被禁用時仍然可以把 session id 傳回給服務器,常常採用的一種技術叫作 URL 重寫,就是把 session id 附加在 URL路徑的後面,附加的方式也有兩種,一種是做爲 URL 路徑的附加信息,另外一種是做爲查詢字符串附加在 URL後面。網絡在整個交互過程當中始終保持狀態,就必須在每一個客戶端可能請求的路徑後面都包含這個 session id。安全

  jsessionid 跟通常的 url 參數傳遞的方式是不一樣的,不是做爲參數跟在 「?」 後面,而是緊跟在 url 後面用 「;」 來分隔。這樣在用戶禁用cookie的時候咱們也能夠傳遞 jsessionid 來使用 session 了,只不過須要每次都把 jsessionid 做爲參數跟在 url 後面傳遞。這樣很麻煩,sun給咱們提供了 2 個方法來使事情變得很簡單:response.encodeURL() 和 response.encodeRedirectURL()。這 2 個方法會判斷 cookie 是否可用,若是禁用了會解析出 url 中的 jsessionid,並鏈接到指定的 url 後面,若是沒有找到 jsessionid ,會自動幫咱們生成一個。服務器

  這兩個方法的區別,是在判斷是否要包含 jsessionid 的邏輯上稍有不一樣。在調用 response.sendRedirect() 前,應該先調用 encodeRedirectURL() 方法,不然可能會丟失 session 信息。這兩個方法的使用方法如:response.sendRedirect(response.encodeURL("/xx/xx.jsp"));。若是 cookie 沒有禁用,咱們在瀏覽器地址欄上看到的地址是 /xx/xx.jsp,若是禁用了 cookie,咱們會看到 /xx/xx.jsp;jsessionid=L7bZL7bZL7bZL7bZL7bZ。因此,爲慎重,應該在程序裏的每個跳轉 url 上都使用這2個方法,來保證 session 的可用性。cookie

 

Session的建立和刪除網絡

  Session的建立session

  1)對於Jsp,若當前頁面爲瀏覽器訪問 web 應用的第一個資源頁面且 jsp 的 Page指定的 Session 屬性的值爲 true

  2)對於 Servlet,若當前 Servlet 爲瀏覽器訪問 web 應用的第一個資源時,使用 request.getSession() 或者 request.getSession(true) 建立

 

  Session的刪除

  1)調用 session.invalidate() 方法

  2)卸載 web 應用

  3)超過了 HttpSession 的過時時間

 

Session 的超時管理

  WEB服務器沒法判斷當前的客戶端瀏覽器是否還會繼續訪問,也沒法檢測客戶端瀏覽器是否關閉,因此,即便客戶已經離開或關閉了瀏覽器,WEB服務器還要保留與以前對應的 HttpSession 對象。

  隨着時間的推移而不斷增長新的訪問客戶端,WEB服務器內存中將會所以積累大量的再也不被使用的 HttpSession 對象,並將最終致使服務器內存耗盡。

  WEB服務器採用 「超時限制」的辦法來判斷客戶端是否還在繼續訪問,若是某個客戶端在必定的時間內沒有發出後續請求,WEB服務器則認爲客戶端已經中止了活動,結束與該客戶端的會話並將與之對應的 HttpSession 對象變成垃圾。

  若是客戶端瀏覽器超時後再次發出訪問請求,WEB服務器則認爲這是一個新的會話的開始,將爲之建立新的 HttpSession 對象和分配新的會話標識號。

  會話超時間隔能夠在 web.xml (Tomcat服務器或者 web應用程序)文件中設置,其默認值由 Servlet 容器定義。

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

 

Session 缺點

  • session 和 cookie是同一類型,若是用戶將瀏覽器設置爲不兼容任何 cookie,那麼該用戶就沒法使用 Session變量,也不能用 cookie存儲信息
  • 分佈式狀況下session共享須要特別處理

 

 

Cookie概述

  Cookie 譯爲小型文本文件或者小甜餅,web 應用程序利用 Cookie 在客戶端緩存服務器端文件。Cookie 是以鍵值對形式存儲在客戶端主機硬盤中,由服務器端發送給客戶端,客戶端在下一次訪問服務器端時,服務器端能夠獲取到客戶端 cookie 緩存文件。

  cookie 能夠由服務器端建立的,而後由服務器端發送給客戶端,客戶端以鍵值對形式存儲 cookie。客戶端再次訪問服務端時,存儲的 cookie 會保存在請求協議中,服務端能夠獲取上次存儲的緩存文件內容。

  Cookie能夠經過瀏覽器和服務器端生成, 存儲在 http 請求頭裏面。

 

Cookie 的缺點

  • 多人公用一臺計算機(致使用戶名密碼不安全)
  • Cookie 被刪除時,部分信息可能出錯
  • Cookie 會被附加在每次 http 請求協議中,增長流量
  • Cookie 使用明文傳遞,安全性低
  • 大小受限
  • Cookie 能夠被用戶禁用,禁用後系統中須要使用 cookie 的地方就不能用了

 

 

sessionStorage 和 localStorage

 

  HTML5中與本地存儲相關的兩個重要內容:web storage 與本地數據庫。其中,web storage 存儲機制是對 HTML4 中 cookie 存儲機制的一個改善。因爲 cookie 存儲機制有不少缺點,HTML5再也不使用它,轉而使用改良後的 web storage 存儲機制。本地數據庫是 HTML5 新增的一個功能,使用它能夠在客戶端本地創建一個數據庫,本來必須保存在服務端數據庫中的內容如今能夠直接保存在客戶端本地,這大大減輕了服務器端的負擔,同時也加快了訪問數據的速度。

  咱們知道,在HTML4 中可使用 cookie 在客戶端保存像用戶名等簡單的用戶信息,可是經過長期的使用,你會發現,用cookie存儲永久數據存在一些問題:

  大小(cookie大小在4KB),帶寬(cookie是隨HTTP事務一塊兒被髮送的,所以會浪費一部分帶寬),複雜性(要正確操縱cookie很困難)

  針對這些問題,在 HTML5 中,從新提供了一種在客戶端本地保存數據的功能 Web Storage

 

  具體說,Web Storage 又分爲兩種:

  1. sessionStorage:將數據保存在 session 對象中。

  2. localStorage:將數據保存在客戶端本地的硬件設備中,即便瀏覽器被關閉了,該數據仍然存在,下次打開瀏覽器訪問網站時仍然能夠繼續使用。

  這二者的區別在於,sessionStorage 爲臨時保存,而 localStorage 爲永久保存。

 

  WebStorage 的目的是克服由 cookie 帶來的一些限制,當數據須要被嚴格控制在客戶端時,不須要持續的將數據發回服務器。

  WebStorage 兩個主要目標:1)提供一種在 cookie 以外存儲會話數據的路徑   2)提供一種存儲大量能夠跨會話存在的數據的機制

 

  HTML5 的 WebStorage 提供了兩種 API:localStorage 和 sessionStorage

  1. 生命週期:localStorage 的生命週期是永久的,關閉頁面或瀏覽器後數據也不會消息,除非主動刪除數據。sessionStorage 的生命週期是僅在當前會話下有效。sessionStorage 引入一個瀏覽器窗口概念,sessionStorage 是在同源的窗口中始終存在的數據。只要這個瀏覽器窗口沒有關閉,即便刷新頁面或者進入同源的另個頁面,數據依然存在。可是 sessionStorage 在關閉了瀏覽器窗口後就會被銷燬。同時獨立的打開同一個窗口同一頁面,sessionStorage 在是不同的(由於,不一樣源了)

  2. 存儲大小:localStorage 和 sessionStorage 的存儲數據大小通常都是 5MB

  3. 存儲位置:localStorage 和 sessionStorage 都保存在客戶端,不與服務器進行互相通訊

  4. 存儲內容類型:localStorage 和 sessionStorage 只能存儲字符串類型,對於複雜的對象可使用 ECMAScript 提供的 JSON 對象來處理

  5. 獲取方式:window.localStorage   和  window.sessionStorage

  6. 應用場景:localStorage 經常使用於長期登陸(+判斷用戶是否已登陸),適合長期保存在本地的數據。  方法:

  setItem(key, value) —— 保存數據,以鍵值對的方式存儲信息

  getItem(key) —— 獲取數據,將鍵值傳入,便可獲取到對應的 value 值

  removeItem(key) —— 刪除單個數據

  clear() —— 刪除全部數據

  key(index) —— 獲取某個索引的 key

相關文章
相關標籤/搜索