學習筆記十(Cookie和Session)

背景:

HTTP無狀態純文本協議,服務器不能記錄瀏覽器的訪問狀態,也就是說服務器不能區分中兩次請求是否由一個客戶端發出。這樣的設計嚴重阻礙的Web程序的設計。如:在我們進行網購時,買了一條褲子,又買了一個手機。由於http協議是無狀態的,如果不通過其他手段,服務器是不能知道用戶到底買了什麼。而Cookie就是解決方案之一。

Cookie

簡介

Cookie實際上就是服務器保存在瀏覽器上的一段信息,主要用於區分不同的用戶。

Cookie運行原理

  • 請求
  • 服務器創建一個Cookie對象,該Cookie對象攜帶用戶信息,服務器發送(響應)給客戶端
  • 以後客戶端再發送請求時,會攜帶該Cookie對象。
  • 服務器會根據該Cookie對象(及信息),區分不同用戶。

Cookie的使用:

1、創建

  • Cookie cookie = new Cookie(String name,String value);
  • response.addCookie(cookie);

2、獲取

  • Cookie[] cookies = request.getCookies();
  • cookie.getName()|getValue()

3、修改

  • 覆蓋式修改
    • Cookie cookie = new Cookie(“同名”,“新值”);
    • response.addCookie(cookie);
  • 直接修改
    • Cookie[] cookies = request.getCookies();
    • 找到指定的Cookie
    • cookie.setValue(“新值”);

4、Cookie的鍵值問題

  • name不可以爲中文,value可以爲中文,需要指定字符集問題,所有建議使用英文。

5、Cookie有效性

  • 默認爲會話級別,與瀏覽器有關(關閉瀏覽器或換一個瀏覽器失效)
  • 持久化
    • setMaxAge(ss:秒);
      • ss>0:在ss秒後失效
      • ss=0:立即失效
      • ss<0:默認會話級別

注意:持久化Cookie,該Cookie就不是會話級別,以具體的持久化操作爲準。

6、Cookie有效路徑(Cookie的路徑指告訴瀏覽器訪問那些地址時該攜帶該Cookie)

  • 默認有效路徑:當前項目路徑
  • setPath():一般設置有效路徑,都是基於當前項目下的路徑進行設置。
    • 如:cookie.setPath(request.getContextPath()+"/a");
    • 設置爲 /項目名/路徑 cookie.setPath(“/項目名/路徑”)
      • 這樣設置只有訪問“/項目名/路徑”下的的資源纔會攜帶Cookie

7、Cookie應用
* 記住密碼

8、Cookie缺陷

  • Cookie的value爲String型,不靈活。
  • Cookie存放在瀏覽器中,不安全。
  • Cookie過多,會浪費流量,增加了客戶端與服務端的數據傳輸量。

Session

簡介

使用Cookie有一個非常大的侷限,就是如果Cookie很多,則無形的增加了客戶端與服務端的數據傳輸量。而且由於瀏覽器對Cookie數量的限制,註定我們不能再Cookie中保存過多的信息,於是Session出現。
Session的作用就是在服務器端保存一些用戶的數據,然後傳遞給用戶一個名字爲JSESSIONID的Cookie,這個JESSIONID對應這個服務器中的一個Session對象,通過它就可以獲取到保存用戶信息的Session

類型: HttpSession

Session工作原理

  • 請求
  • 服務器創建Session,同時創建一個特殊的Cookie,該Cookie的key爲固定值:JSESSIONID,value爲session的id。
  • 服務器將該Cookie對象發送(響應)給客戶端
  • 以後客戶端再請求時,會攜帶該Cookie對象。
  • 服務器會根據Cookie的value,找到相應的Session,從而區分不同的給用戶。

Session獲取

  • html(Servlet):request.getSession()
  • jsp:直接獲取(session是jsp中的隱含對象)

Session有效性

  • 默認有效性:當前會話(因爲特殊的Cookie是會話級別)
  • Session存活時間
    • 默認存活時間爲30分。
  • 持久化Session
    • 持久化特殊Cookie

    • 設置session的非活動時間
      1、 web.xml中

       * 	<session-config>
       	 	<session-timeout>30分鐘</session-timeout>
       	 </session-config>
      

      2、 session.setMaxInactiveInterval(ss秒);

      • ss>0:在ss秒後失效
      • ss<=0:永不失效(Tomcat>=7)
      • session立即失效
        • session.invalidate();

Session鈍化與活化

  • 鈍化:將session對象及session對象中的數據,一同從內存中序列化到硬盤的過程稱之爲鈍化。
    • 時機:服務器關閉時觸發
  • 活化:將session對象及session對象中的數據,一同從硬盤反序列化到內存的過程稱之爲活化。
    • 時機:服務器重啓時觸發

表單重複提交問題

1、 轉發,F5
2、提交後,網速慢,連續點擊提交按鈕
3、提交後,點擊回退按鈕,繼續提交
表單提交流程:

  • 提交-Servlet-響應

解決思路:
在Servlet中干預提交,第一次提交,以後不提交

  1. 使用UUID,作爲Token。將Token存放到session域和隱藏域中。( UUID:是一個全球唯一的32爲的16進制的隨機數。)
  2. 提交,判斷變量是否爲初始值
    true:提交,移除session域中的Token(UUID)。
    false:不提交
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章