1. 程式人生 > >JavaEE複習回顧六: 會話技術Cookie && Session

JavaEE複習回顧六: 會話技術Cookie && Session

Cookie 和 Session 會話技術,我找了幾篇部落格,另外結合自己的學習,寫了這篇回顧,後面如果有更深的理解,我再接著新增內容。

相關部落格地址:

目錄

一、會話技術簡介

1.1、儲存客戶端的狀態

由一個問題引出今天的內容,例如網站的購物系統,使用者將購買的商品資訊儲存到哪 裡?因為Http協議是無狀態的,也就是說每個客戶訪問伺服器端資源時,伺服器並 不知道該客戶端是誰,所以需要會話技術識別客戶端的狀態。會話技術是幫助伺服器 記住客戶端狀態(區分客戶端)

1.2、會話技術

從開啟一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成為一次會話。

會話技術就是記錄這次會話中客戶端的狀態與資料的。

會話技術分為Cookie和Session:

Cookie:資料儲存在客戶端本地,減少伺服器端的儲存的壓力,安全性不好,客戶端 可以清除cookie

Session:將資料儲存到伺服器端,安全性相對好,增加伺服器的壓力

1.3、Cookie技術

Cookie技術是將使用者的資料儲存到客戶端的技術,我們分為兩方面學習:

第一,伺服器端怎樣將一個Cookie傳送到客戶端

第二,伺服器端怎樣接受客戶端攜帶的Cookie

1.3.1、伺服器端向客戶端傳送一個Cookie

1)建立Cookie:

Cookie cookie = new Cookie(String cookieName,String cookieValue);

示例:

Cookie cookie = new Cookie("username","zhangsan");

那麼該cookie會以響應頭的形式傳送給客戶端:

注意:Cookie中不能儲存中文

1.3.2、設定Cookie在客戶端的持久化時間:

cookie.setMaxAge(int seconds); ---時間秒

注意:如果不設定持久化時間,cookie會儲存在瀏覽器的記憶體中,瀏覽器關閉cookie資訊銷燬(會話級別的cookie),如果設定持久化時間,cookie資訊會被持久化到瀏覽器的磁碟檔案裡

示例:

cookie.setMaxAge(10*60);

設定cookie資訊在瀏覽器的磁碟檔案中儲存的時間是10分鐘,過期瀏覽器 自動刪除該cookie資訊

1.3.3、設定Cookie的攜帶路徑:

cookie.setPath(String path);

注意:如果不設定攜帶路徑,那麼該cookie資訊會在訪問產生該cookie的 web資源所在的路徑都攜帶cookie資訊

示例:

cookie.setPath("/WEB16");

代表訪問WEB16應用中的任何資源都攜帶cookie

cookie.setPath("/WEB16/cookieServlet");

代表訪問WEB16中的cookieServlet時才攜帶cookie資訊

1.3.4、向客戶端傳送cookie:

response.addCookie(Cookie cookie);

1.3.5、刪除客戶端的cookie:

如果想刪除客戶端的已經儲存的cookie資訊,那麼就使用同名同路徑的持久化時間為0的cookie進行覆蓋即可

1.3.6、伺服器端怎麼接受客戶端攜帶的Cookie

cookie資訊是以請求頭的方式傳送到伺服器端的:

  • 通過request獲得所有的Cookie:

Cookie[] cookies = request.getCookies();
  • 遍歷Cookie陣列,通過Cookie的名稱獲得我們想要的Cookie
for(Cookie cookie : cookies){

    if(cookie.getName().equal(cookieName)){

        String cookieValue = cookie.getValue();

    }

}

1.2、Session技術

Session技術是將資料儲存在伺服器端的技術,會為每個客戶端都建立一塊記憶體空間 儲存客戶的資料,但客戶端需要每次都攜帶一個標識ID去伺服器中尋找屬於自己的內 存空間。所以說Session的實現是基於Cookie,Session需要藉助於Cookie儲存客 戶的唯一性標識JSESSIONID

在Session這我們需要學習如下三個問題:

怎樣獲得屬於本客戶端的session物件(記憶體區域)?

怎樣向session中存取資料(session也是一個域物件)?

session物件的生命週期?

1.2.1、獲得Session物件

HttpSession session = request.getSession();

此方法會獲得專屬於當前會話的Session物件,如果伺服器端沒有該會話的Session 物件會建立一個新的Session返回,如果已經有了屬於該會話的Session直接將已有 的Session返回(實質就是根據JSESSIONID判斷該客戶端是否在伺服器上已經存在 session了)

1.2.2、怎樣向session中存取資料(session也是一個域物件)

Session也是儲存資料的區域物件,所以session物件也具有如下三個方法:

session.setAttribute(String name,Object obj);

session.getAttribute(String name);

session.removeAttribute(String name);

1.2.3、Session物件的生命週期(面試題/筆試題)

建立:第一次執行request.getSession()時建立

銷燬:

伺服器(非正常)關閉時

session過期/失效(預設30分鐘)

問題:時間的起算點 從何時開始計算30分鐘?

從不操作伺服器端的資源開始計時

可以在工程的web.xml中進行配置

<session-config>

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

</session-config>

手動銷燬session

session.invalidate();

1.2.4、作用範圍:

預設在一次會話中,也就是說在,一次會話中任何資源公用一個session物件

面試題:瀏覽器關閉,session就銷燬了?   不對

總結:

重點:圖

cookie購物

session

session域

會話技術:

Cookie技術:存到客戶端

傳送cookie

Cookie cookie = new Cookie(name,value)

cookie.setMaxAge(秒)

cookie.setPath()

response.addCookie(cookie)

獲得cookie

Cookie[] cookies = request.getCookies();

cookie.getName();

cookie.getValue();

Session技術:存到伺服器端 藉助cookie儲存JSESSIONID

HttpSession session = request.getSession();

setAttribute(name,value);

getAttribute(name);

session生命週期

建立:第一次指定request.getSession();

銷燬:伺服器關閉、session失效/過期、手動session.invalidate();

session作用範圍:預設一會話中