servlet篇(三)【會話技術:Cookie和Session的使用】

複習JavaWeb—cookie和session會話技術

會話技術

一次會話:訪問一個 web 應用,瀏覽器客戶端和服務器之間可能會產生多次的請求和響應,從瀏覽器訪問服務器開始,到訪問服務器結束,關閉瀏覽器爲止,這期間產生的多次請求和響應加在一次就稱爲瀏覽器客戶端和服務器之間的一次會話。

由於 http 協議是無狀態的協議,也就是說,當用戶訪問 web 應用時,服務器無法區分客戶端的身份。就好比我們在某寶上結算購物車商品提交請求時,它的服務器就必須根據請求獲取我們的身份,然後找到我們要結算的商品,這時候就需要用到會話技術。

總而言之,會話技術就是在同一個瀏覽器與服務器的多次請求間,將請求數據持久化存儲的技術。作用就是存儲會話中客戶端的狀態和數據。

會話技術分爲兩種:Cookie 和 Session.

  • Cookie:將數據存儲在客戶端本地,減少服務端的存儲壓力,安全性相對不強(可以被客戶端清除)
  • Session:將數據存儲在服務端,安全性相對較強,但是會增加服務器壓力。

Cookie

Cookie的簡要介紹

Cookie 是小段的文本信息,通過 Cookie 可以標識用戶身份、記錄用戶名以及密碼、跟蹤重複用戶(比如我們在瀏覽器打開了一個 web 應用並已經登錄,此時在瀏覽器的新頁面打開該 web 應用已經是登錄狀態)。

當客戶端第一次訪問 web 應用時,該 web 應用的服務端會生成一個 Cookie,通過 response 響應返回給客戶端,客戶端將 Cookie 保存到本地某個指定的目錄下。當客戶端再次訪問該 web 應用時,該 web 應用對應的 Cookie 會跟着 request 請求一起到該 web 應用的服務端,服務端會查看 Cookie 中記錄的信息,並根據該信息返回相對應的信息給客戶端。

Cookie 是以鍵值對(name-value)的形式存儲在本地硬盤中,用戶可以手動清除 Cookie 信息或者服務器設置 Cookie 在客戶端的持久化時間,當過了持久化時間後,瀏覽器自動刪除對應的 Cookie 信息(如果不設置持久化時間,當瀏覽器關閉時該 Cookie 信息就會被清除)。

Cookie的常用方法

1)public Cookie(String name,String value)

Cookie 的構造方法,name 參數是該 Cookie 的唯一標識,不能包含等號 (=)、分號 (😉、逗號 (,)、換行符 (\n)、回車符 (\r)、製表符 (\t) 和空格字符,美元符號 ($) 不能作爲第一個字符;value 是該 Cookie 的值,不能包含分號或逗號(除非它們包含在轉義的雙引號中)。

2)setValuegetValue

設置和獲取 Cookie 值的方法

3)setMaxAgegetMaxAge

設置和獲取 Cookie 的最大有效期(單位是秒)的方法;默認是 -1

4)setPathgetPath

設置和獲取允許訪問該 Cookie 的路徑(即 Cookie 的path屬性)。一般 Cookie 默認整個 web 應用都可以使用,可以設置只有該應用下的某路徑能訪問該 Cookie

5)setDomaingetDomain

設置和獲取可以訪問該 Cookie 的域名(即 Cookie 的domain屬性)。domain的值規定爲 “.域名”。Cookie 的隱私安全機制決定 Cookie 是不可跨域名訪問。即 www.baidu.com 和 www.google.com 之間的 Cookie 是互不交接的,即使是同一級域名,不同二級域名也不能交接

6)String getName()

獲取 Cookie 的name

Cookie應用

1)將 Cookie 加入到響應和請求中:

  • response 響應對象定義有 addCookie(Cookie cookie) 方法,用於在響應頭上增加一個相應的 Set-Cookie 頭字段;服務器通過響應消息將 Cookie 發送給客戶端
response.addCookie(cookie)
  • request 請求對象定義有 getCookies() 方法,用於獲取客戶端提交的所有 Cookie(Cookie數組)
Cookie[] cookies = request.getCookies()

2)設置 Cookie 編碼解決中文亂碼問題:

見案例:

String name = "中華";
Cookie cookie = new Cookie("country",URLEncoder.encode(name,"UTF-8"));   //設置爲utf-8編碼

3)Cookie 的修改和刪除:

Cookie 是沒有提供刪除 Cookie 的方法,也沒有提供修改 Cookie 的方法,那麼我們怎麼修改或刪除它呢?

我們知道,一個 Cookie 是由 name-value 的結構組成,而 name 是標識(找出)該 Cookie 的字段,現在是不是有想法了呢!

修改:Cookie 的 name 標識 Cookie,那麼重寫構造一個 name 相同,但 value 是我們想要的 Cookie

String name = "中國";
Cookie cookie = new Cookie("country",URLEncoder.encode(name,"UTF-8"));
response.addCookie(cookie);

name 爲 country 的值已經改變了(本質上是新的 Cookie 覆蓋了原來的 Cookie)。

刪除:刪除沒有別的方法,只能設置 Cookie 的有效時間 MaxAge 的值:負數表示該 Cookie 是臨時性的,關閉瀏覽器該 Cookie 就會失效;正數表示該 Cookie 的有效時間;0 表示刪除該 Cookie

//仍然需要構造一個新的 Cookie 覆蓋原來的 Cookie ,只不過 MaxAge 的值發生改變
String name = "中國";
Cookie cookie = new Cookie("country",URLEncoder.encode(name,"UTF-8"));
cookie.setMaxAge(0);
response.addCookie(cookie);

name 爲 country 的 Cookie 已刪除。

:修改、刪除 Cookie 時,新建的 Cookie 除了 value、MaxAge 之外的所有屬性都要與原 Cookie 相同,否則瀏覽器將視爲不同的 Cookie,不予覆蓋,導致修改、刪除失敗。

Session

Session的簡要介紹

Cookie 技術可以將用戶的信息保存在各自的瀏覽器中,並且可以在多次請求下實現數據的共享。但若是傳遞的信息比較多,使用 Cookie 技術顯然會增大服務端處理的難度(服務器需要一個一個識別 Cookie 直至獲取當前需要的 Cookie 信息 );而且 Cookie 存在本地存在信息安全性問題。對應的 Session 便應運而生。

Session 對象是由服務端自動創建的與用戶請求相關的對象。服務器爲每個用戶都生成一個 Session 對象,用於保存該用戶的信息,跟蹤用戶的操作狀態。相對 Cookie,Session 是一種把會話數據保存在服務器的技術。

當瀏覽器第一次發送情求給 web 應用時,該 web 應用的服務器自動生成一個 Session 對象和一個 Session ID 用來唯一標識這個 Session 對象。隨後服務端以 Session ID 的值創建一個 Cookie(name=JSESSIONID,value=Session ID的值) 並通過 response 響應將該 Cookie 發送給瀏覽器。

當瀏覽器第二次向該 web 應用發起請求時,會將此前產生的 name=JSESSIONID 的 Cookie 的值與服務端保存的所有 Session ID 進行對比,找到該用戶(該瀏覽器)對應的 Session 對象,並繼續使用該 Session 對象訪問 web 應用。

一般來說,服務器會在一定的時間內(默認30分鐘)保存這個 Session,過了時間後就會銷燬這個 Session 對象。

Session的常用方法

1)String getId()

獲取 Session 的 Session ID

2)boolean isNew()

判斷該 Session 是否是新創建的(判斷用戶是否是第一次訪問服務器)

3)void invalidate()

使當前對象的session失效(退出登陸,註銷時)

4)void setMaxInactiveInterval(int second)int getMaxInactiveInterval()

設置和獲取該 Session 對象的最大有效 非活動時間(單位秒)

5)long getCreationTime()

獲取該 Session 對象被創建的時間

6)long getCreationTime()

返回該 Session 對象最後活躍時間

7)Enumeration getAttributeNames()

獲取該 Session 對象的所有屬性名

8)setAttribute(String name,Object obj)getAttribute(String name)removeAttribute(String name)

設置和獲取,刪除 Session 對象

Session應用

1)獲取、使用 Session:

//獲取
HttpSession httpSession = request.getSession();  //得到服務端創建的Session對象
//設置Session屬性
httpSession.setAttribute("name","記得點贊哦!");   //設置Session對象中屬性名爲name的值
//獲取Session對象中指定屬性名的值
HttpSession httpSession = request.getSession();
String value = (String)httpSession.getAttribute("name");  //獲取屬性名爲name的屬性值

:Session 對象中的屬性是 name-value 即 String-Object 的鍵值對,所以獲取到某屬性的屬性值時需要進行類型轉換。

Cookie 和 Session 的區別

1)從存儲內容:

  • Cookie:只能存儲字符串,而且存儲中文字符時需要對其編碼

  • Session:可以存儲任何類型的數據(Object)

2)從信息安全:

  • Cookie:Cookie 存儲在瀏覽器中,對客戶端是可見的。Cookie 存儲的數據容易泄露或丟失

  • Session:Session 存儲在服務器上,對客戶端是透明不可見的。不存在敏感信息泄露丟失問題,安全性較高

3)從有效期:

  • Cookie:Cookie 存放在本地硬盤中,通過 maxAge 屬性設置有效時間;只要有效期未過,即使關閉瀏覽器 Cookie 依舊有效存在

  • Session:Session 保存在服務器中,通過設置 maxInactiveInterval 屬性確定 Session 的有效時間,並且 Session 依賴於名爲 JSESSIONID 的 Cookie,該 Cookie 的默認 maxAge 屬性值爲 -1,即若關閉瀏覽器,Cookie 便銷燬了,對應的 Session 雖然沒有從服務器中銷燬,但也失效了

4)從對服務器的壓力:

  • Cookie:Cookie 保存在客戶端,不佔用服務器資源

  • Session:Session 保存在服務器,每個用戶都會產生一個 Session ,過多的 Session 會消耗大量的內存,需要序列化(持久化,鈍化)

5)從瀏覽器的支持:

  • Cookie:如果瀏覽器禁用了 Cookie,那麼 Cookie 是無效的

  • Session:如果瀏覽器禁用了 Cookie,Session 可以通過 URI 地址重寫來進行會話跟蹤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章