會話技術: cookie 及 session 域對象總結
會話技術
概述
會話
當打開一個瀏覽器的時候,意味着會話開始了
在開始和結束間,瀏覽器和服務器可以進行N次的交互
當關閉了該瀏覽器的時候,意味着會話結束了
作用
用來存儲瀏覽器和服務器交互產生的N多數據(cookie或者session)
會話技術的分類:cookie和session
cookie(瀏覽器端的會話技術):瀏覽器和服務器交互的數據可以存儲在cookie,整個cookie在瀏覽器端
session(服務器端的會話技術):瀏覽器和服務器交互的數據可以存儲在session,整個session在服務器端
什麼情況下我們會選擇使用cookie或session去存儲瀏覽器和服務器交互中產生的數據?
當用戶的私有數據需要在多個Servlet之間傳遞的時候,可以使用會話技術解決(cookie&session)
客戶端的會話技術:cookie
概述
cookie: 小紙條
作用:存儲並且傳遞數據 (瀏覽器和服務器交互的數據)
特點
1 數據都在瀏覽器方
2 cookie是由服務器創建交給瀏覽器保存
cookie的使用
服務器如何創建cookie
Cookie cookie=new Cookie(String,String);
服務器如果把cookie傳遞給客戶端
response.addCookie(cookie);
注意:服務器可以給瀏覽器傳遞多個cookie,瀏覽器都會保存 但存在key值覆蓋
服務器端如何獲取到瀏覽器傳遞的cookie信息
Cookie[] request.getCookies(); //自動從請求頭中 獲取cookie信息 並且切割並封裝成多個cookie對象
cookie的常用API
getName(); 返回值String,返回的是cookie的key
getValue(); 返回值String,返回的是cookie的value
cookie的整個使用過程
服務器創建cookie存儲數據--->把整個cookie傳遞給瀏覽器---->瀏覽器端自動保存cookie
瀏覽器會自動將保存的cookie傳遞服務器--->服務器獲取傳遞的cookie數據--->使用數據
cookie的細節
會話級別的cookie(默認方式)和持久化級別的cookie
會話級別的cookie:瀏覽器關閉當前會話默認會把保存的cookie全部銷燬(默認)
持久化級別的cookie:可以讓瀏覽器在一定時間不論開關都會保留cookie
方法:setMaxAge(秒)
>0: 有效時間
=0:過期(清除)
特點:設置的時間如果到期了,瀏覽器會自動把過期的cookie銷燬
cookie的路徑:通過設置cookie的路徑 設置該cookie在哪些資源下有效
方法api:setPath(“路徑”)
/day10/cs5 只在訪問/day10/cs5資源才帶
/day10 訪問整個day10項目下的資源都帶(企業)
/ 訪問整個服務器上的項目資源都帶
默認 當前servlet訪問路徑的上一級
訪問到當前servlet的上一級路徑才帶
例如:Servlet: /demo/sd1==訪問/demo下的資源才攜帶
cookie的注意點:
cookie中不能出現特殊符號 例如:空格 分號 逗號
cookie存入的數據有大小限制 4kb
案例:案例–記錄用戶最新訪問時間 且輸出用戶的上次訪問時間
服務器端的會話技術:session
概述
session是保存在服務器端的會話技術
作用:也是爲了保存會話中產生的數據
特點
1 保存在session中的數據在服務器端
2 session其實就是一個域對象 xxxAttribute()存儲數據的方法
session的使用
session獲取:request.getSession()
作用範圍:
數據在一次會話中共享
因爲在一次會話中,訪問多少個servlet,獲取到的session都是同一個
但是如果不在一次會話中,多個servlet中產生的不再是同一個session對象
session的剖析
爲什麼在一次會話中,使用的都是同一個session對象
Cookie:JSESSIONID=C573A3AF2DDF0491AE6FB31608525641
因爲jsessionid相同,根據jsessionid獲取的session是同一個
爲什麼瀏覽器關閉以後(不在一個會話了),使用的就不是同一個對象了
瀏覽器一關閉 Cookie銷燬了 cookie中的JSESSIONID也就沒有
session的執行流程
當執行到調用getSession方法時,首先判斷cookie中是否有jsessionid。
如果不存在jsessionid:那麼直接創建一個新的session對象返回給你,並且向響應頭中寫一個新的jsessionid存放cookie給瀏覽器保存
如果存在jsessionid:從服務器內存中去獲取對應的session對象繼續使用
(瀏覽器關閉)
再次判斷cookie中是否有jsessionid,如果沒有,那麼直接創建一個新的session對象返回給你,並且向響應頭中寫一個新的jsessionid存放cookie給瀏覽器
session和cookie的區別?(面試題)
session:服務器端的會話技術 數據都在服務器
cookie:客戶端的會話技術 數據都在瀏覽器
session:存儲的內容沒有大小限制
cookie:只能存儲4kb的內容
session:存儲的數據安全
cookie:存儲的數據不安全
域對象的總結
哪些技術可以在多個servlet/jsp之間進行數據傳遞:servletContext request cookie session
域對象:servletContext request session 都在服務器端 都有xxxAttribute方法
Request
創建:請求一次 創建一個request對象
銷燬:響應回去,就銷燬
數據作用範圍:一次請求,多次跳轉中,使用的是同一個request對象
ServletContext
創建:服務器啓動,就創建且只創建一個ServletContext對象
銷燬:服務器關閉銷燬
數據作用範圍:整個項目所有人共用
Session
創建:java認爲在會話的第一次訪問到request.getSession方法創建session對象
銷燬
1 被動銷燬:30分鐘不使用自動從內存中移出
2 主動銷燬:session.invalidate()
3 服務器非正常關閉
數據作用範圍:一次會話中 因爲一次會話中使用的是同一個session對象
只要多個servlet/jsp之間做數據傳遞和共享了,都要想到以上域對象