會話技術 cookie和session 學習筆記

衣舞晨風發表於2016-07-24

什麼是會話
基本概念: 指使用者開一個瀏覽器,訪問一個網站,只要不關閉該瀏覽器,不管該使用者點選多少個超連結,訪問多少資源,直到使用者關閉瀏覽器,整個這個過程我們稱為一次會話.

一、cookie詳解

cookie小結

  1. cookie 是在服務端建立
    來自韓順平授課筆記
  2. cookie 是儲存在瀏覽器這端
  3. cookie 的生命週期可以通過:
    cookie.setMaxAge(2000);
    ☞ 如果不設定setMaxAge則該cookie的生命週期當瀏覽器關閉時,就消亡.
  4. cookie 可以被多個瀏覽器共享(與session的區別)
  5. 怎麼形象的理解?
    我們可以把cookie 想成一張表(或者一個字典)
    這裡寫圖片描述
    如果cookie重名會有什麼問題?
    如果重名就會替換存在的cookie值.
  6. 一個web應用可以儲存多個cookie,但儲存在同一個cookie文字在客戶端瀏覽器下
  7. cookie存放的時候是以明文方式存放,因此安全較低.,我們可以通過加密後儲存
  8. cookie預設生命週期是會話級別,可以通過setMaxAge() 可以設定生命週期
    setMaxAge(正數) , 即多少秒後該cookie失效
    setMaxAge(0) ,刪除該cookie
    setMaxAge(負數), 相當於該cookie生命週期是會話級別。
            //先得到該cookie
            Cookie cookies[]=request.getCookies();
            for(Cookie cookie: cookies){
                if(cookie.getName().equals("id")){
                    System.out.println("id");
                    //刪除
                    cookie.setMaxAge(0);
                    //一定帶上這句話,否則不能刪除
                    response.addCookie(cookie); 
                }
            }

特別說明: 如果該web應用只有一個cookie ,則刪除該cookie後,在瀏覽器的臨時資料夾下沒有該cookie檔案,如果該web應用有多個cookie,則刪除一個cookie後,檔案還在,只是該cookie沒有了。

2、cookie的細節

  1. 一個瀏覽器最多放入 300cookie,一個web站點,最多 20cookie,而且一個cookie大小限制子4k
  2. cookie存放中文,怎麼處理?
    存放:
String val=java.net.URLEncoder.encode("我是名字","utf-8");
Cookie cookie=new Cookie("name",val);

取出:

String val=java.net.URLDecoder.decode(cookie.getValue(), "utf-8");
out.println("name ="+val);

3、cookie可以用來做什麼呢?

  1. 儲存使用者名稱、密碼,在一定時間不用重新登入
  2. 記錄使用者訪問網站的喜好,比如有無背景音樂、網頁的背景色是什麼
  3. 網站的個性化,比如定製網站的服務、內容

4、cookie使用

  1. 如何建立一個cookie(在伺服器端建立的)
Cookie c=new Cookie(String name, String val);
  1. 如何將一個cookie新增到客戶端
response.addCookie(c);
  1. 如何讀取cookie(從客戶端讀到伺服器)
request.getCookie();

5、cookie其它說明

  1. 可以通過IE——工具——internet選項——隱私——高階來啟用或是禁用cookie
  2. 由於cookie的資訊是儲存在客戶端的,因此安全性不高
  3. cookie資訊的生命週期可以在建立時設定(比如30s),從建立那一時刻起,就開始計時,到時該cookie的資訊就無效了

二、session詳解

什麼是session?
當使用者開啟瀏覽器,訪問某個網站時,伺服器就會在伺服器的記憶體為該瀏覽器分配一個空間,該空間被這個瀏覽器獨佔。這個空間就是session空間,該空間中的資料預設存在時間為30min,你也可以修改該值。
這裡寫圖片描述

上面說的這個30min指的是使用者的發呆時間,而不是累計時間

1、session生命週期

系統預設是30分鐘。
有3種session生命週期的設定:

  • 1、一個地方是 tomcat/conf/web.xml
<session-config>
        <session-timeout>30</session-timeout>//表示30分鐘的意思
</session-config>

對所有的web應用生效

  • 2、另外一個地方,就是在單個web應用的下去修改 web.xml
<session-config>
  <session-timeout>30</session-timeout>session精確到分鐘,cookie精確到秒
  </session-config>

如果發生衝突,則以自己的web應用優先順序高
- 3、session.setMaxInactiveinterval(60) 發呆六十秒後session失效

2、對session和cookie生命週期小結:

這裡寫圖片描述

3、session小結

  1. session是存在伺服器的記憶體中
  2. 一個使用者瀏覽器,獨享一個session域物件
  3. session中的屬性的預設生命週期是30min ,你可以通過 web.xml來修改
  4. session中可以存放多個屬性
  5. session 可以存放物件
  6. 如果 session.setAttribute(“name”,val) , 如果名字重複,則會替換該屬性.
  7. 為什麼伺服器能夠為不同的瀏覽器提供不同session?
    因為每個瀏覽器去訪問web站點的時候,如果發出的http請求頭沒有帶JSESSIONID頭就會自動給你建立一個並返回。

4、如何使用session?

  1. 得到session
    HttpSession hs=request.getSession(true);
  2. 向session新增屬性
    hs.setAttribute(String name,Object val);
  3. 從session得到某個屬性
    String name=hs.getAttribute(String name);
  4. 從session中刪除掉某個屬性
    hs.removeAttribute(String name);
  5. 登出session中的內容(比較安全的一種方式)
    ht.setMaxInactiveInterval(0);

三、cookie與session的比較

  1. 存在的位置
    cookie:存在客戶端的臨時資料夾
    session:存在伺服器記憶體中,一個session域物件為一個使用者瀏覽器服務
  2. 安全性
    cookie:是以明文的方式放在客戶端的,安全性弱,可以通過(MD5)加密再存放。
    session:是存放在伺服器記憶體中,所有安全性好
  3. 網路傳輸
    cookie:會傳遞資訊給伺服器
    session的屬性值不會給客戶端
  4. 生命週期
    cookie的生命週期:是累計時間,即如果我們給cookie設定setMaxAge(30),則30秒後失效。
    session的生命週期:是間隔時間,如我們設定session 20min,指在20min內,如果沒有訪問session,則session失效(session失效是指無法讀取session屬性),
    在以下情況session也會失效
    (1)關閉tomcat
    (2)reload web應用
    (3)時間到
    (4) 呼叫invalidate方法
  5. 訪問範圍
    cookie:為多個使用者瀏覽器共享。
    session:為一個使用者瀏覽器獨享。
  6. 使用原則
    因為session會佔用伺服器的記憶體,因此不要向session中存放過多過大的物件,會影響效能。

本文部分內容參考網路及韓順平老師的講義

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章