Cookie:把會話數據保存到客戶端的技術,瀏覽器自身具有存儲Cookie數據的能力,同時具備自動攜帶數據的能力
Session:把會話數據保存到服務端的技術,使用散列的結構存儲數據 依賴cookie
cookie和session:都是用來存儲會話數據的
區別:cookie把數據保存在客戶端,session是把數據保存在服務端
cookie不便於保存大量數據,由於網絡壓力大。而session能夠保存大量的數據,可是服務器壓力大
cookie技術不安全,可能會篡改數據,而session比較安全。
session技術依賴於cookie技術。
Cookie: 存在於:響應頭set-Cookie 請求頭:Cookie 經過請求request獲取 注意cookie不支持中文
0 工做流程:
瀏覽器訪問服務器,服務器建立鍵值對的形式(cookie),
經過響應(響應頭 set-cookie)返回給瀏覽器,
cookie保存在瀏覽器上,在下次訪問的服務器時候,
根據 必定的規則 攜帶不一樣的cookie,不是全部的都會攜帶,
規則:當訪問的url包含此cookie的path的時候,就會攜帶這個cookie;反之不會。
經過請求(請求頭 cookie)攜帶,服務器就能夠拿到這些cookie。
1 建立Cookie數據,發送到客戶端,能夠有多個cookie發送到客戶端保存java
[Java] 純文本查看 複製代碼web
?數組
1瀏覽器
2緩存
new Cookie(String name,String value) //建立tomcat
response.addCookie(cookie) //把cookie數據加入到響應頭中,發送給瀏覽器 放在響應頭中Set-Cookie:username=zhangsan安全
2 獲取cookie: //不能獲取指定的cookie 只能經過獲取全部的cookie數據而後服務器
[Java] 純文本查看 複製代碼cookie
?網絡
1
2
3
Cookie[] request.getCookies() //經過request獲取全部的cookie數據,返回Cookie對象的數組
getName() //遍歷根據Cookie對象獲取name
getValue() //遍歷根據Cookie對象獲取value
3 設置cookie有效期:不清除緩存的狀況下,cookie數據默認保存在瀏覽器內存中,默認當瀏覽器關閉後cookie數據清除,
跟服務器是否正常關閉無關,數據存儲在瀏覽器
若是設置了cookie的有效期,那麼跟是否關閉瀏覽器無關
手動設置cookie有效期:cookie.setMaxAge(int 秒):設置Cookie的有效期是秒。
默認設置爲負值,則爲瀏覽器進程Cookie(內存中保存),關閉瀏覽器就失效
0秒就是刪除該cookie(前提,必須路徑相同),殺死cookie
[Java] 純文本查看 複製代碼
?
1
2
3
4
cookie = new Cookie("要刪除的cookie的名稱", "")
cookie.setPath("要刪除cookie的路徑")
cookie.setMaxAge(0)
response.addCookie(cookie)
原理:瀏覽器接收到cookie後,會把數據持久的保存到磁盤上second秒,過時以前始終有效,不管瀏覽器是否關閉
a.相同鍵名的Cookie(值能夠相同或不一樣)能夠存在於不一樣的路徑下。
b.刪除時,若是當前路徑下沒有鍵爲"key"的Cookie,則查詢所有父路徑,檢索到就執行刪除操做(每次只能刪除一個與本身最近的父路徑Cookie)
c.讀取Cookie時只能讀取直接父路徑的Cookie。若是當前路徑爲/test/test2,要讀取的鍵爲"key"。當前路徑讀取後,還要讀取/test,/test讀取後,還要讀取/
d.在作Java的web項目時,因爲通常的Web服務器(如Tomcat或Jetty)都用Context來管理不一樣的WebApplication,這樣對於每一個Context有不一樣的Path,
在一個Server中有多個WebApplication時要特別當心,不要設置Path爲/的Cookie,容易誤操做。(固然前提是域名相同)
4 Cookie路徑的設置:從項目名到資源名前.當訪問的url包含此cookie的path的時候,就會攜帶這個cookie;反之不會
同一路徑下不能有重名Cookie,有的話後邊覆蓋前面。不一樣路徑下能夠有重名Cookie。默認的cookie路徑是在根目錄下/day12
setPath(「路徑」):cookie的路徑被包含
cookie默認存儲路徑爲:訪問Servlet的路徑的父路徑 最後一級爲資源名
一個路徑不存在重名的cookie,不一樣路徑下能夠有重名的cookie。
[Java] 純文本查看 複製代碼
?
1
2
3
4
5
6
cookie:
url: /webtest/aa/bb/cc
當咱們訪問 http://ip:端口/webtest/aa/bb/cc路徑或這個路徑的子路徑時都會攜帶當前cookie
子路徑:
http://localhost/webtest/aa/b...
http://localhost/webtest/aa/b...
5 注意Cookie不能跨瀏覽器,不支持中文,若是想要想存儲,先把中文用utf-8 編碼存儲亂碼,再解碼
response中多條set-Cookie設置
Session:服務器端的會話技術,底層依賴Cookie 把JseesionId寫回瀏覽器,瀏覽器關閉後Session也不能使用;經過請求request獲取
一次會話中僅存在一個session。只要此次會話存在session一直有效
[Java] 純文本查看 複製代碼
?
1
2
3
4
JSESSIONID :
httpOnly true
path /webtest
value AD063751712C047BD98C8560BF3988B6
0 工做流程:
瀏覽器向服務器發送請求,服務器判斷瀏覽器是否攜帶了惟一標識
如有惟一標識:
服務器會拿着惟一標識去session池中查詢是否有對應的標識
如有:直接操做session對象,並把它存放到瀏覽器端
若無:服務器會爲其建立一個私有的內存空間,能夠操做session,把標識存放到瀏覽器端
若無惟一標識:
服務器會爲其建立一個私有的內存空間,能夠操做session,把它標識放到瀏覽器端,標識格式JSESSIONID=ASDHAJSADKASDA
1 獲取session對象:
[Java] 純文本查看 複製代碼
?
1
2
3
HttpSession session=request.getSession()
獲取JessionId的方式:
session.getId();
2 session是一個域對象:
[Java] 純文本查看 複製代碼
?
1
2
3
setAttribute(String name,Object obj) //設置屬性值
getAttribute(String name) //獲取屬性值
removeAttribute(String name) //移除屬性值
生命週期:tomcat默認保存session的時間爲30分鐘, 使用request獲取到的只是cookie的字符串,直接操做不會做用到瀏覽器的cookie,須要新new一個cookie去覆蓋 建立:java中認爲第一次調用request.getSession()時建立 銷燬:1 服務器非正常關閉會銷燬,沒有來得及序列化 正常關閉,重啓服務器都不會銷燬。序列化和反序列化了 關閉瀏覽器再打開會消失,JsessionId丟失了,找不見了。session並未消失 2 超時: tomcat中設置的session默認存活時間是30分鐘,配置在web.xml中 手動設置存活時間:setMaxInactiveInterval(int interval) //單位是秒 超時就會自動銷燬 3 手動銷燬:session.invalidate() 做用範圍: 只在一次會話中有效。誰創建的會話在那個會話中有效。不會形成多個用戶訪問數據紊亂 由於底層依賴Cookie技術,因此默認瀏覽器關閉後也會失效。不能跨web應用。