背景:
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:默認會話級別
- setMaxAge(ss:秒);
注意:持久化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中干預提交,第一次提交,以後不提交
- 使用UUID,作爲Token。將Token存放到session域和隱藏域中。( UUID:是一個全球唯一的32爲的16進制的隨機數。)
- 提交,判斷變量是否爲初始值
true:提交,移除session域中的Token(UUID)。
false:不提交