Cookie與Session的區別
- 為什麼要使用Cookie和Session?HTTP協議是無狀態連結。在一次回話(開啟瀏覽器訪問一個站點中的不同內容直到瀏覽器關閉稱為一次回話)中,多次請求無法共享資料,無法跟蹤使用者的行為。
解決方案:
1.在URL位址列拼接引數,但是不安全(`www.xxx.do?userId=1`)
2.使用Cookie
3.使用Session
複製程式碼
Cookie
Cookie是客戶端技術,所有的瀏覽器都支援Cookie快取,Cookie資料存放的位置位於客戶端的記憶體中,也可以調整Cookie存放與磁碟中。
步驟:
1.使用者請求一個支援Cookie的後臺伺服器
2.伺服器做請求處理,返回相應資訊,並設定Cookie快取使用者資訊。在可以在開發者模式相應頭中看到Set-Cookie
看到Cookie中的資料,在後續的請求都會自動傳送Cookie到伺服器,直到Cookie銷燬或過期。
3.客戶端再次請求,在請求頭中攜帶Cookie。
4.伺服器接收到請求資料,並解析Cookie內容,做出請求相應。
Cookie分為會話Cookie和持久化Cookie。會話Cookie存放與客戶端的記憶體中,瀏覽器關閉後Cookie自動銷燬;持久化Cookie存放於磁碟中,瀏覽器關閉後不會銷燬Cookie。可以通過cookie.setMaxAge(value);
來設定Cookie的存活時間。cookie.setMaxAge(0);
表示刪除Cookie,cookie.setMaxAge(value<0);
表示會話Cookie;cookie.setMaxAge(value>0);
指定描述,可以用於設定持久化Cookie。
設定Cookie的作用域
Cookie中的欄位中有兩個可以設定Cookie的作用域。Path
設定Cookie的有效URL路徑,Domain
指定Cookie的有效域。
cookie.setPath("/");
表示Cookie的作用域為整個應用,cookie.setPath("/**");
表示Cookie的作用域為**
的作用範圍,路徑為**
都能訪問到Cookie,cookie.setPath("/view/a");
表示路徑為view/a
的路徑下都能訪問Cookie,而view/b
不能訪問到Cookie。
cookie.setDomain("value");
預設為web應用域名或者Ip地址。如果需要設定跨域訪問:photo.google.com
和mail.google.com
實現cookie共享需要設定cookie.setDomain(".google.com");
Cookie的缺陷:
1.Cookie資料保留在請求頭中,不安全。
2.Cookie資料儲存中文需要轉碼,瀏覽器預設iso8859。
3.Cookie存放的資料為String型別
4.Cookie資料容量限制為4KB以內,一臺伺服器最多保留20個Cookie,一個客戶端瀏覽器最多儲存300個Cookie。
5.共享資料本應該放在伺服器上。
Session
Session是服務端技術,利用這個技術,伺服器在執行時可以為每一個使用者的瀏覽器建立一個獨享的Session物件,用於Session為使用者瀏覽器獨享,所以使用者在訪問伺服器時,可以把各自的資料放在各自的Session中,當使用者再去訪問伺服器其他web資源時,其他web資源再從服務端的Session中獲取資料。
步驟:
1.使用者請求一個支援Cookie的後臺伺服器
2.伺服器做出請求處理,建立Session物件,儲存使用者的相關資訊,並建立Cookie物件,Cookie物件的jsessionid
指向Session存放在伺服器的記憶體地址。伺服器通過相應頭Set-Cookie
返回給瀏覽器Cookie的資訊(Cookie中包含Session的記憶體地址,Session會消耗伺服器的資源),在後續的請求都會自動傳送Cookie到伺服器,伺服器通過解析Cookie中的jsessionid
來獲取Session中的資料。
3.客戶端再次請求,在請求頭中攜帶Cookie。
4.伺服器接收到請求資料,伺服器通過解析Cookie中的jsessionid
在記憶體中來獲取Session中的資料,做出請求相應。
Session超時管理
在瀏覽器與伺服器的會話中,如果瀏覽器長時間沒有與伺服器進行互動,伺服器的Session會自動銷燬(網站登入後長時間沒有互動後需要再次登入),瀏覽器與伺服器之前的互動的Session就不存在了,如果需要再次使用者Session的快取,需要再次請求伺服器重新建立新的Session。如果直接關閉瀏覽器,Session也會自動銷燬,因為Session的應用地址時儲存在Cookie中的,Cookie中資料是儲存在瀏覽器的記憶體中的,瀏覽器關閉後Cookie銷燬,無法識別Session的記憶體地址,超時後Session會自動銷燬。
設定Session失效時間的三種方式:
1.在專案中的web.xml中設定,時間表示分鐘
<session-config>
<session-timeout>2</session-timeout>
</session-config>
2.在tomcat的web.xml中設定,預設時30分鐘
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3.在Servlet中設定
HttpSession session = request.getSession();
session.setMaxInactiveInterval(60);//單位為秒
-----------------
優先順序是就近原則:Servlet>專案中的web.xml>Tomcat中的web.xml
複製程式碼
URL重寫
Session依託Cookie來記錄Session在伺服器的記憶體地址,但是瀏覽器可以設定禁用Cookie,這樣瀏覽器請求資料的時候無法攜帶jsessionid
導致Session在伺服器中失效。但是我們可以在位址列手動拼接jsessionid
,如localhost:8080/demo;jessionid=***
,這樣做很麻煩,Sun公司提供了兩個方法用於在瀏覽器位址列拼接jessionid
。
response.encodeUrl(url);
和response.encodeRedirectUrl(ulr);
。方法會先判斷瀏覽器是否禁用了cookie,如果禁用了cookie會在url後拼接上jessionid
,如果瀏覽器沒有禁用cookie,Session會通過請求頭Cookie的jessionid
來傳遞。