session與cookie的區別

Cookie與Session的區別

  • 爲何要使用Cookie和Session?HTTP協議是無狀態連接。在一次回話(打開瀏覽器訪問一個站點中的不一樣內容直到瀏覽器關閉稱爲一次回話)中,屢次請求沒法共享數據,沒法跟蹤用戶的行爲。

解決方案:web

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銷燬或過時。tomcat

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的做用域session

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.commail.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來傳遞。

相關文章
相關標籤/搜索