Cookie和Session詳解及區別
目錄
- Cookie機制
- 定義
- 原理
- 使用
- 建立Cookie,Cookies方法
- 訪問Cookie
- 刪除
- Session機制
- 定義
- 執行機制
- 使用
- 建立Session,Session方法
- 訪問Session
- 刪除 Session 會話資料
- 兩者的區別
- 存取方式
- 安全性
- 有效期
- 伺服器壓力
- 瀏覽器支援
- 跨域支援上的不同
一.Cookie機制
1.定義
Cookies是儲存在客戶機的文字檔案,它們儲存了大量軌跡資訊。在servlet技術基礎上,JSP顯然能夠提供對HTTP cookies的支援。
2.原理:
- 客戶端傳送請求至伺服器,包含一系列資訊:比如名字,年齡,ID號碼等到。
- 伺服器將這些資訊(比如名字,年齡,ID號碼等等)儲存在cookie中,通過響應將cookies傳送至瀏覽器。
- 瀏覽器在本地機中儲存這些資訊,以備不時之需。
- 當下一次瀏覽器傳送任何請求至伺服器時,它會同時將這些cookies資訊傳送給伺服器(cookie附在請求資源的HTTP請求頭上傳送給伺服器。),然後伺服器使用這些資訊來識別使用者或者幹些其它事情。
Cookies 通常設定在 HTTP 頭資訊中(雖然 JavaScript 也可以直接在瀏覽器上設定一個 Cookie)。Cookie的內容主要包括:名字,值,過期時間,路徑和域。
3.使用
1.建立:通過 Servlet 設定 Cookies 包括四個步驟:
- 建立一個 Cookie 物件:您可以呼叫帶有 cookie 名稱和 cookie 值的 Cookie 建構函式,cookie 名稱和 cookie 值都是字串。
Cookie cookie = new Cookie("key","value"); 注意:無論是名字還是值,都不應該包含空格或以下任何字元:[ ] ( ) = , " / ? @ : ;
- 設定最大生存週期:您可以使用 setMaxAge 方法來指定 cookie 能夠保持有效的時間(以秒為單位)。下面將設定一個最長有效期為 24 小時的 cookie。
cookie.setMaxAge(60*60*24); //設定有效時間為一天
- 設定作用域:Path表示伺服器的主機名,只有瀏覽器通過這個主機名訪問伺服器的時候,才會提交這個cookie到服務端
cookie.setPath(""127.0.0.1");
- 傳送 Cookie 到 HTTP 響應頭:您可以使用 response.addCookie 來新增 HTTP 響應頭中的 Cookies,如下所示:
response.addCookie(cookie);
2.訪問:通過 Servlet 讀取 Cookies
要讀取 Cookies,您需要通過呼叫 HttpServletRequest 的 getCookies( ) 方法建立一個 javax.servlet.http.Cookie 物件的陣列。然後迴圈遍歷陣列,並使用 getName() 和 getValue() 方法來訪問每個 cookie 和關聯的值。
Cookie cookie = null;
Cookie[] cookies = null;
// 獲取與該域相關的 Cookies 的陣列
cookies = request.getCookies();
3.刪除Cookies:通過 Servlet 刪除 Cookies
刪除 Cookies 是非常簡單的。如果您想刪除一個 cookie,那麼您只需要按照以下三個步驟進行:
- 讀取一個現有的 cookie,並把它儲存在 Cookie 物件中。
- 使用 setMaxAge() 方法設定 cookie 的年齡為零,來刪除現有的 cookie。
- 把這個 cookie 新增到響應頭。
可以手動在 Internet Explorer 中刪除 Cookies。在"工具"選單,選擇"Internet 選項"。如果要刪除所有的 Cookies,請按"刪除 Cookies"。
二.Session機制
1.定義
Session對應的中文翻譯是會話。 會話指的是從使用者開啟瀏覽器訪問一個網站開始,無論在這個網站中訪問了多少頁面,點選了多少連結,都屬於同一個會話。 直到該使用者關閉瀏覽器為止,都屬於同一個會話。
2.執行機制
- 當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識(稱為sessionID),如果已包含則說明以前已經為此客戶端建立過session,伺服器就按照sessionID把這個session檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含sessionID,則為此客戶端建立一個session並且生成一個與此session相關聯的sessionID,sessionID的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個sessionID將被在本次響應中返回給客戶端儲存。 原理圖:
- 儲存這個sessionID的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發揮給伺服器。一般這個cookie的名字都是類似於sessionID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把sessionID傳遞迴伺服器,可以使用下面的方法解決:
如果瀏覽器把cookie功能關閉,那麼服務端就無法獲取jsessionid,每一次訪問,且每次都會生成一個新的session物件。為了解決這個問題,可以使用 response.encodeURL("getSession.jsp") response.encodeURL方法會把getSession.jsp這個url轉換為 getSession.jsp;jsessionid=22424AEA86ADBE89F335EEB649D997A8 通過這個方式,提交jsessionid到伺服器。 伺服器根據這個jsessionid匹配到對應的session. 與session相關的功能,就可以正常工作了。 例: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%> <%session.setAttribute("name", "teemo");%> <a href="<%=response.encodeURL("getSession.jsp")%>">跳轉到獲取session的頁面</a>
3.使用
- 建立:通過HttpSession物件
Servlet 提供了 HttpSession 介面,該介面提供了一種跨多個頁面請求或訪問網站時識別使用者以及儲存有關使用者資訊的方式。
Servlet 容器使用這個介面來建立一個 HTTP 客戶端和 HTTP 伺服器之間的 session 會話。會話持續一個指定的時間段,跨多個連線或頁面請求。
通過呼叫 HttpServletRequest 的公共方法 getSession() 來獲取 HttpSession 物件,如下所示:
HttpSession session = request.getSession(); session.setAttribute("name", "teemo");//設值 注意:在jsp中,9大隱式物件包含session,所以可以直接使用 如:<%session.setAttribute("name","teemo");%>
- 設值
String name = (String)session.getAttribute("name");
- 刪除 Session 會話資料
- 設定session的有效期:比如登入一個網站,登入後,在短時間內,依然可以繼續訪問而不用重新登入。但是較長時間不登入,依然會要求重新登入,這是因為服務端的session在一段時間不使用後,就失效了。這個時間,在Tomcat預設配置下,是30分鐘。
可以通過 d:/tomcat/conf/web.xml 中的session-config 配置進行調整:
<session-config> <session-timeout>15</session-timeout> </session-config>
- 移除一個特定的屬性:您可以呼叫 public void removeAttribute(String name) 方法來刪除與特定的鍵相關聯的值。 to delete the value associated with a particular key.
- 刪除整個 session 會話:您可以呼叫 public void invalidate() 方法來丟棄整個 session 會話。
- 設定 session 會話過期時間:您可以呼叫 public void setMaxInactiveInterval(int interval) 方法來單獨設定 session 會話超時。和第一種方法的效果一樣
- 登出使用者:如果使用的是支援 servlet 2.4 的伺服器,您可以呼叫 logout 來登出 Web 伺服器的客戶端,並把屬於所有使用者的所有 session 會話設定為無效。
- 設定session的有效期:比如登入一個網站,登入後,在短時間內,依然可以繼續訪問而不用重新登入。但是較長時間不登入,依然會要求重新登入,這是因為服務端的session在一段時間不使用後,就失效了。這個時間,在Tomcat預設配置下,是30分鐘。
可以通過 d:/tomcat/conf/web.xml 中的session-config 配置進行調整:
三.兩者的區別
Cookie與Session都能夠進行會話跟蹤,但是完成的原理不太一樣。普通狀況下二者均能夠滿足需求,但有時不能夠運用Cookie,有時不能夠運用Session。下面經過比擬闡明兩者的特性以及適用的場所:
- 存取方式的不同Cookie中只能保管ASCII字串,假如需求存取Unicode字元或者二進位制資料,需求先進行編碼。Cookie中也不能直接存取Java物件。若要儲存略微複雜的資訊,運用Cookie是比較艱難的。而Session中能夠存取任何型別的資料,包括而不限於String、Integer、List、Map等。Session中也能夠直接保管JavaBean乃至任何Java類,物件等,運用起來十分便當。能夠把Session看做是一個Java容器類。
- 隱私策略的不同Cookie儲存在客戶端閱讀器中,對客戶端是可見的,客戶端的一些程式可能會窺探、複製以至修正Cookie中的內容。而Session儲存在伺服器上,對客戶端是透明的,不存在敏感資訊洩露的風險。假如選用Cookie,比較好的方法是,敏感的資訊如賬號密碼等儘量不要寫到Cookie中。最好是像Google、Baidu那樣將Cookie資訊加密,提交到伺服器後再進行解密,保證Cookie中的資訊只要本人能讀得懂。而假如選擇Session就省事多了,反正是放在伺服器上,Session裡任何隱私都能夠有效的保護。
- 有效期上的不同 使用過Google的人都曉得,假如登入過Google,則Google的登入資訊長期有效。使用者不用每次訪問都重新登入,Google會持久地記載該使用者的登入資訊。要到達這種效果,運用Cookie會是比較好的選擇。只需要設定Cookie的過期時間屬性為一個很大很大的數字。由於Session依賴於名為JSESSIONID的Cookie,而CookieJSESSIONID的過期時間默許為–1,只需關閉了閱讀器該Session就會失效,因而Session不能完成資訊永世有效的效果。運用URL地址重寫也不能完成。而且假如設定Session的超時時間過長,伺服器累計的Session就會越多,越容易招致記憶體溢位。
- 伺服器壓力的不同Session是保管在伺服器端的,每個使用者都會產生一個Session。假如併發訪問的使用者十分多,會產生十分多的Session,耗費大量的記憶體。因而像Google、Baidu、Sina這樣併發訪問量極高的網站,是不太可能運用Session來追蹤客戶會話的。而Cookie保管在客戶端,不佔用伺服器資源。假如併發使用的使用者十分多,Cookie是很好的選擇。關於Google、Baidu、Sina來說,Cookie或許是唯一的選擇。
- 瀏覽器支援的不同 Cookie是需要客戶端瀏覽器支援的。假如客戶端禁用了Cookie,或者不支援Cookie,則會話跟蹤會失效。關於WAP上的應用,常規的Cookie就派不上用場了。假如客戶端瀏覽器不支援Cookie,需要運用Session以及URL地址重寫。需要注意的是一切的用到Session程式的URL都要進行URL地址重寫,否則Session會話跟蹤還會失效。關於WAP應用來說,Session+URL地址重寫或許是它唯一的選擇。假如客戶端支援Cookie,則Cookie既能夠設為本瀏覽器視窗以及子視窗內有效(把過期時間設為–1),也能夠設為一切閱讀器視窗內有效(把過期時間設為某個大於0的整數)。但Session只能在本閱讀器視窗以及其子視窗內有效。假如兩個瀏覽器視窗互不相干,它們將運用兩個不同的Session.
- 跨域支援上的不同(建立Cookie中第三步:3.設定作用域)Cookie支援跨域名訪問,例如將domain屬性設定為.biaodianfu.com,則以.biaodianfu.com為字尾的一切域名均能夠訪問該Cookie。跨域名Cookie如今被普遍用在網路中,例如Google、Baidu、Sina等。而Session則不會支援跨域名訪問。Session僅在他所在的域名內有效。僅運用Cookie或者僅運用Session可能完成不了理想的效果。這時應該嘗試一下同時運用Cookie與Session。Cookie與Session的搭配運用在實踐專案中會完成很多意想不到的效果。