Cookie&Session會話技術&Servlet三個作用域總結
什麼是會話?
Web應用中的會話過程類似於生活中的打電話過程,它指的是一個客戶端(瀏覽器)於web伺服器之間連續發生的一系列請求和響應過程,例如,一個使用者在某網站上的整個購物過程就是一個會話.
Cookie:
Cookie和瀏覽器快取有什麼區別?
共同點:瀏覽器快取可以快取任意內容(上網瀏覽的所有內容),cookie只是伺服器需要瀏覽器快取資料(瀏覽器快取中的一部分).
什麼是Cookie:
在web應用中,Cookie的功能類似於一張購物會員卡,當用戶通過瀏覽器訪問web瀏覽器時,伺服器會給客戶端傳送一些資訊,這些資訊都儲存在Cookie中.這樣,當瀏覽器再次訪問伺服器是,都會在請求頭中將Cookie傳送給伺服器,方便伺服器對瀏覽器做出正確的響應.
伺服器向客戶端傳送Cookie時,會在HTTP響應頭欄位中增加Set-Cookie響應頭欄位
一張圖來描述Cookie在瀏覽器和伺服器之間的傳輸過程:
上圖中,描述了Cookie在瀏覽器和伺服器之間的傳輸過程.當用戶第一次訪問伺服器時,伺服器會在響應訊息中增加Set-Cookie頭欄位,將使用者資訊以Cookie的形式傳送給瀏覽器.一旦使用者瀏覽器接受了伺服器傳送的Cookie資訊,就會將它儲存在瀏覽器的緩衝區,這樣,當瀏覽器後續訪問該伺服器時,都會在請求訊息中將使用者資訊以Cookie的形式傳送給web伺服器,從而使伺服器分辨出當前是由哪個使用者發出的.
Cookie的基本使用:
建立Cookie:newCookie(name,value), javax.servlet.http.Cookie
將Cookie傳送給瀏覽器:HttpServletResponse.addCokie(javax.servlet.http.Cookie)
接受瀏覽器所攜帶的所有Cookie:HttpServletRequset.getCookie()
Cookie的分類:
會話級別的Cookie:預設的,關閉了瀏覽器Cookie就銷燬了
持久級別的Cookie:需要設定有效時長,關閉瀏覽器也不會銷燬的Cookie
setMaxAge(intexpiry);以秒為時間,超過該時間後Cookie會自動銷燬
setMaxAge(0),手動刪除永續性的Cookie.(前提,path和name必須一致)
setPath(Stringuri),設定Cookie的有效路徑
Cookie的唯一表示:
唯一標示:domain+path+name(類似Jav中的 包 + 類名)
domian域名,不同的網站使用的是不同的域名,cookie就不同
path路徑,通過 cookie.setPath( )設定的內容
namecookie 名稱,通過 new Cookie(name,….)確定的內容
如果路徑和名稱一樣,兩次addCookie(),後者將會覆蓋前者
Cookie的API:
Session的概述
什麼是Session:
Session技術就好比醫院發給病人的就醫卡和醫院為每個病人保留病例檔案的過程.當瀏覽器訪問web伺服器時,Sevlet容器就會建立一個Session物件和ID屬性,其中,Session物件就相當於病歷檔案,ID就相當於就診卡號.當客戶端後續訪問瀏覽器時,只要經標識號傳遞給伺服器,伺服器就能判斷出該請求時哪個客戶端傳送的,從而選擇與之對應的Session物件為之服務.
需要注意的是,由於客戶端需要接收.記錄和回送Sessio物件的ID,因此,通常情況下,Session是藉助Cookie技術傳遞ID屬性的.
上圖中,使用者甲和乙都呼叫buServlet將商品新增到購物車,呼叫payServlet進行商品結算.由於甲和乙購買商品的過程類似,在此,以使用者甲為例進行詳細說明.當用戶甲訪問購物網站時,伺服器為甲建立了一個Session物件(相當於購物車).當甲將Nokia手機新增到購物車時,Nokia手機的資訊便存放到了Session物件中.同時,伺服器將Session物件的ID屬性以Cookie(Set-Cookie-JSESSIONID=1111)的形式返回給甲的瀏覽器.當甲完成購物進行結賬時,需要向伺服器傳送結賬請求,這時,瀏覽器自動在請求訊息頭將Cookie(cooki:JSESSIONID=111)資訊回送給伺服器,伺服器根據ID屬性找到為使用者甲所建立的Session物件,並將Session物件中存放的Noki手機資訊取出進行結算.
Cookie和Session的選取:
Cookie是有大小的和個數的限制的.Session存到伺服器的技術,沒有大小和個數的限制
Cookie相對於Session來講不安全的
如何使用Session:
PublicHttpSession getSession(Boolean create)
根據傳遞的引數判斷是否建立HTTPSession物件,如果為true,則在相關的HTTPSession物件不存在時建立並返回HTTPSession物件,否則不建立新的HttpSession物件,而是返回個null
PublicHttpSession getSession()
相當於上個方法為true時的情況下,在相關HTTPSession物件不存在時總是建立新的HTTPSession物件.
注意事項:
實際上,Session的技術是依賴於Cookie的(通過Cookie中的JSESSIONID來區分請求是屬於哪一個Session的)。
不同的瀏覽器會產生不同的Session
30分鐘的過期時間指的是兩次請求之間的間隔,不是總的時長。
JSESSIONID沒有有效期,所以關閉瀏覽器則JSESSIONID的Cookie消失,也就是說,如果在訪問某網站時,關閉了瀏覽器,再次開啟同一個瀏覽器,且沒有超過30分鐘,也會產生新的Session。原生的瀏覽器是這樣,國產瀏覽器能把之前的JSESSIONID續上。
如果某個瀏覽器傳送了請求後沒有再發送新的請求,則此瀏覽器所對應的Session在伺服器記憶體中還會存在30分鐘。直到過期銷燬。
Servlet三個作用域總結:
ServletContext:針對一個WEB應用.一個WEB應用只有一個ServletContext物件,使用該物件儲存的資料在整個WEB應用中都有效.
建立:伺服器啟動的時候
銷燬:伺服器關閉時候或者專案移除的時候
HTTPSession:針對一次會話.使用該物件儲存資料,一次會話(多次請求)內資料有效.
建立:伺服器第一次呼叫getSession()的時候,伺服器建立session的物件
銷燬:
1,非正常關閉伺服器(正常關閉:session被序列化)
2,session過期了,預設時間是30分鐘(可以修改,在xml配置檔案中,很少用)
3,手動呼叫session的invalidate的方法
HttpServletRequset:針對一次請求.使用該物件儲存資料,一次請求(一個頁面,如果是請求轉發多個頁面)內資料有效
建立:客戶端向伺服器傳送一次請求
銷燬:伺服器為這次請求做出響應之後,銷燬request
三個作用域物件操作的API相同
存放資料:setAttribute(name,value):void
獲得資料:getAttribute(name):Object
刪除資料:removeAttribute(name):void
getAttributeNames():Enumeration<String>列舉集合,即將淘汰