1. 程式人生 > >會話技術Cookie&Session

會話技術Cookie&Session

存取 對象 http協議 唯一性 安全 attribute config 面試題 訪問

一、會話技術簡介

1.存儲客戶端的狀態

  如網站的購物系統,用戶將購買的商品信息存儲到哪裏?因為Http協議是無狀態的,也就是說每個客戶訪問服務器端資源時,服務器並不知道該客戶端是誰,所以需要會話技術識別客戶端的狀態。會話技術是幫助服務器 記住客戶端狀態(區分客戶端)

2.會話技術

從打開一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成為一次會話。會話技術就是記錄這次會話中客戶端的狀態與數據的。

會話技術分為Cookie和Session:

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

  Session:將數據存儲到服務器端

,安全性相對好,增加服務器的壓力

二、Cookie技術

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

  第一,服務器端怎樣將一個Cookie發送到客戶端

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

1.服務器端向客戶端發送一個Cookie

1)創建Cookie:

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

  示例:

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

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

    技術分享

  註意:Cookie中不能存儲中文

2)設置Cookie在客戶端的持久化時間:

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

  註意:如果不設置持久化時間,cookie會存儲在瀏覽器的內存中,瀏覽器關閉 cookie信息銷毀(會話級別的cookie),如果設置持久化時間,cookie信息會被持久化到瀏覽器的磁盤文件裏

  示例:

    cookie.setMaxAge(10*60);

    設置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘,過期瀏覽器自動刪除該cookie信息

3)設置Cookie的攜帶路徑:

  cookie.setPath(String path);

  註意:如果不設置攜帶路徑,那麽該cookie信息會在訪問產生該cookie的 web資源所在的路徑都攜帶cookie信息

  示例:

    cookie.setPath("/WEB16");

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

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

    代表訪問WEB16中的cookieServlet時才攜帶cookie信息

4)向客戶端發送cookie:

response.addCookie(Cookie cookie);

5)刪除客戶端的cookie:

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

2.服務器端怎麽接受客戶端攜帶的Cookie

cookie信息是以請求頭的方式發送到服務器端的:

技術分享

1)通過request獲得所有的Cookie:

  Cookie[] cookies = request.getCookies();

2)遍歷Cookie數組,通過Cookie的名稱獲得我們想要的Cookie

  for(Cookie cookie : cookies){

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

      String cookieValue = cookie.getValue();

    }

  }

三、Session技術

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

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

  怎樣獲得屬於本客戶端的session對象(內存區域)?

  怎樣向session中存取數據(session也是一個域對象)?

  session對象的生命周期?

1.獲得Session對象

HttpSession session = request.getSession();

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

2.怎樣向session中存取數據(session也是一個域對象)

Session也是存儲數據的區域對象,所以session對象也具有如下三個方法:

  session.setAttribute(String name,Object obj);

  session.getAttribute(String name);

  session.removeAttribute(String name);

3.Session對象的生命周期(面試題/筆試題)

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

銷毀:

  1)服務器(非正常)關閉時

  2)session過期/失效(默認30分鐘)

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

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

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

      <session-config>

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

      </session-config>

  3)手動銷毀session

    session.invalidate();

作用範圍:

  默認在一次會話中,也就是說在,一次會話中任何資源公用一個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作用範圍:默認一會話中

會話技術Cookie&Session