1. 程式人生 > >理解cookie和session技術

理解cookie和session技術

一、HTTP協議的無狀態性

WEB應用程式使用的是HTTP協議傳輸資料的,HTTP協議是一個無狀態的協議,這次資料傳輸完畢,客戶端會和服務端斷開連線,再次傳輸資料就需要重新建立新的連線,這也就無法會話跟蹤。可以理解為伺服器是一個健忘症,這次你訪問他和它交換資料,下次來他就不認識你了,這是一個很不友好的事情。這個問題有一個很直接的方法解決它,就是伺服器你認識你,你每次都告訴它你的名字,也就是每次客戶端訪問的時候都需要帶上自己的引數,可以採用GET請求每次帶上自己的引數,但是這肯定是不可取的,應為GET請求會把引數資訊放在瀏覽器的位址列中,資訊都暴露了,完全保證不了安全性。為了解決HTTP協議這個健忘症患者,cookie和session技術登上了歷史舞臺。

二、Cookie

既然每次GET請求的時候把資料帶上保證安全的,cookie技術把資料放在請求頭中了,這樣就安全一點了吧。其實也不怎麼安全..後面說。cookie技術是一種客戶端技術,首先程式給客戶端以cookie的形式把資料存放在了瀏覽器中,這樣瀏覽器再次去請求的時候會帶上這個資料,這樣瀏覽器就認識這個請求了。訪問過程就是客戶端第一次訪問伺服器的時候瀏覽器會在響應頭中加上Set-Cookie資訊,當跳轉到另外一個資源的時候也就是再次傳送一個請求的時候,請求會在請求頭上帶上Cookie:xxx,也就是前面自己的資料,目的是讓伺服器認識自己。

1.cookie的操作

  • 建立cookie物件並新增到響應中

    Cookie cookie = new Cookie(String name,String value);
    response.addCookie(cookie);
  • 從請求中獲取cookie中的資料

    Cookie[] cs = request.getCookies();//可以對cs,for-each迭代出每一個cookie物件
    String cookieName = cookie.getName();
    String value = cookie.getValue();
  • 讓cookie屬性支援中文

    Cookie cookie = new Cookie("cookieName",URLEncoder.encode(username,UTF-8));//建立cookie物件對屬性的編碼
    String value = URLDecoder.decode(cookie.getValue(),"UTF-8");//獲取cookie中的資料對屬性的解碼
  • 修改cookie中的屬性

    //方法1:設定相同名稱的key,覆蓋上一個,還要把獲取的cookie物件新增到響應中去
    Cookie c2 = new Cookie("currentName","HHH");
    resp.addCookie(c2);
    //方法2:呼叫setValue();  此時還需要把物件重新加入到響應中
    c.setValue("HHH");
    resp.addCookie(c);
  • 設定cookie的存活時間

    c.setMaxAge(-1); // 設定負數表示-會話cookie,預設.  瀏覽器關閉cookie也就消失
    c.setMaxAge(0); // 刪除cookie
    c.setMaxAge(10); //持久化cookie,設定cookie可以存活的時間是10s
  • 設定cookie的path

    /**
     * 設定cookie的path為"/",設定整個根路徑都可以共享這個cookie,
     * 預設情況是最後一個 / ,  例如/cookie/login,只會對cookie/list共享並不會對 /xx/list共享,也就是隻共享給以/cookie開始資源
     */
    c.setPath("/");

2.Cookie的缺點

雖然cookie把資料放在了請求頭中,但是還是把資料存放在了瀏覽器中,瀏覽器都有一個可以檢視cookie的選項,顯然是有些不安全。另外瀏覽器和伺服器一般會對cookie的大小做限制,還有寫中文每次編碼解碼很麻煩。

三、Session

Cookie技術是把資料存放在了客戶端瀏覽器中,與之相反,Session是把資料存放在了伺服器中。session中文意思是會話,伺服器為每一次會話建立了一塊記憶體區域來存在資料,第一次請求伺服器把資料存放在了伺服器中,伺服器給客戶端響應一個編號,下次再來請求的時候拿著這個編號在伺服器的記憶體空間中可以找到自己的資料。與cookie不同的是,session存放資料的時候是以key-value形式存放,這裡的value是Object型別的,而cookie是String型別的。

瀏覽器第一次請求伺服器,伺服器會建立cookie物件並且把資料按照key-value的形式起來,然後在響應頭中加上Set-Cookie:xxx(這裡的xxx其實就是id,好讓下一次在可以在伺服器中找到),下一次訪問的時候,會在請求頭中加上Cookie:xxx。其實可以看出,session本質上也是cookie。

需要注意的是:session會在回話結束後消失,也就是關閉瀏覽器或者關閉伺服器session會失效。

1.Session的操作

  • 建立和獲取session物件

    第一次請求會建立物件,當再次請求當然就不會再建立了,除非當前會話結束。

    HttpSession session = req.getSession();
    HttpSession session = getSession(boolean create);  
    / * true(預設) : 若當前請求中存在session物件,就直接返回,如果不存在就建立一個再返回
     * false:  若當前請求中存在session物件,就直接返回,如果不存在返回null;
     */
  • 在session中儲存資料

    session.setAttribute(String key,Object value);//key的命名一般為大寫
  • 取資料

    Object value = session.getAttribute(String key);//根據key,去取value
  • 刪除session

     session.removeAttribute(String key);//可以根據key去刪除
     session.invalidate();//銷燬session物件
  • 超時機制

    //一段時間內瀏覽器與伺服器沒有互動會自動銷燬session物件
    session.setMaxInactiveInterval(30);//30s

2.session的缺點

session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用伺服器的效能。