day10_cookiesession学习笔记
一、會話概述
1、什么是會話?如同打電話。
會話可簡單理解為:用戶開一個瀏覽器,點擊多個超鏈接,訪問服務器多個web資源,然后關閉瀏覽器,整個過程稱之為一個會話。2、會話過程要解決的問題是什么?保持各個客戶端自己的數據。
? 每個用戶在使用瀏覽器與服務器進行會話的過程中,不可避免各自會產生一些數據,程序要想辦法為每個用戶保存這些數據。
? 例如:用戶點擊超鏈接通過一個servlet購買了一個商品,程序應該想辦法保存用戶購買的商品,以便于用戶點結帳servlet時,結帳servlet可以得到用戶購買的商品為用戶結帳。
? 思考:用戶購買的商品保存在request或servletContext中行不行?答:不行。
保存會話數據的兩種技術 :
Cookie:是客戶端技術,程序把每個用戶的數據以cookie的形式寫給用戶各自的瀏覽器。
? ?當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶著各自的數據去。
? ? 這樣,web資源處理的就是用戶各自的數據了。
HttpSession:Session是服務器端技術,利用這個技術,服務器在運行時可以為每一個用戶的瀏覽器創建一個其獨享的HttpSession對象,
? ? 由于session為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數據放在各自的session中,
? ? 當用戶再去訪問服務器中的其它web資源時,其它web資源再從用戶各自的session中取出數據為用戶服務。
二、Cookie(餅干/小甜餅)
由于Cookie數據是由客戶端來保存和攜帶的,所以稱之為客戶端技術。
javax.servlet.http.Cookie類用于創建一個Cookie,response接口中定義了一個addCookie方法,它用于在其響應消息頭中增加一個相應的Set-Cookie頭字段。?
同樣,request接口中也定義了一個getCookies方法,它用于獲取客戶端提交的Cookie。
1、屬性:
name:該名稱不能唯一確定一個Cookie。路徑可能不同。
value:不能存中文。
path:默認值是寫Cookie的那個程序的訪問路徑。
比如:http://localhost:8080/day10_00_cookie/servlet/ck1寫的Cookie
path就是:/day10_00_cookie/servlet?即看當前創建cookie的資源(servlet)文件路徑。
客戶端在訪問服務器另外資源時,根據訪問的路徑來決定是否帶著Cookie到服務器。
如果當前訪問的路徑是以cookie的path開頭的路徑(包括在該路徑下的子路徑),瀏覽器就帶Cookie。否則不帶Cookie。
maxAge:cookie的緩存時間。默認是-1,-1指示該cookie將保留到瀏覽器關閉為止。(默認存在瀏覽器的緩存中)。單位是秒。
負數:表示cookie的數據存在瀏覽器緩存中。
0:表示刪除。注意:路徑要保持一致,否則可能刪錯人。
正數:表示緩存(持久化到磁盤上)的時間。單位是秒。
2、方法:
public Cookie(String name, String value) 構造方法(只有一個)
setValue與getValue方法?
setMaxAge與getMaxAge方法(單位為秒)
setPath與getPath方法
setDomain與getDomain方法
getName方法
3、補充知識點:
? ? 面試題:Servlet負責那些事情?
? ? ? ? 1. 獲取表單數據
? ? ? ? 2. 處理業務邏輯
? ? ? ? 3. 分發轉向
? ? 案例:
? ? ? ? 1. 客戶端記住用戶名
? ? ? ? 2. 顯示用戶上次瀏覽過的商品
三、HttpSession(會話)
在WEB開發中,服務器可以為每個用戶瀏覽器創建一個會話對象(session對象),注意:一個瀏覽器獨占一個session對象(默認情況下)。 因此,在需要保存用戶數據時,服務器程序可以把用戶數據寫到用戶瀏覽器獨占的session中,當用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數據,為用戶服務。 Session和Cookie的主要區別在于: Cookie是把用戶的數據寫給用戶的瀏覽器。 Session技術把用戶的數據寫到用戶獨占的session中。 Session對象由服務器創建,開發人員可以調用request對象的getSession方法得到session對象。1、為什么要學HttpSession?
>?它也是一個域對象:?servletContext(不同瀏覽器) >?session(同一瀏覽器的多個會話) > request(一個會話)?
>?同一個會話下,可以使一個應用的多個資源共享數據。
>?cookie是客戶端技術,只能存字符串,不安全,存儲少量信息,不適合存儲敏感信息。HttpSession是服務器端的技術,它可以存對象。
2、常用方法
把數據保存在HttpSession對象中,該對象也是一個域對象。
void?setAttribute(String?name, Object?value)?使用指定名稱將對象綁定到此會話。如果具有同樣名稱的對象已經綁定到該會話,則替換該對象。
Object?getAttribute(String?name)?返回與此會話中的指定名稱綁定在一起的對象,如果沒有對象綁定在該名稱下,則返回 null。
void?removeAttribute(String?name)?從此會話中移除與指定名稱綁定在一起的對象。如果會話沒有與指定名稱綁定在一起的對象,則此方法不執行任何操作。
String getId()?返回包含分配給此會話的唯一標識符的字符串。標識符是由 servlet 容器分配的,并且是與實現相關的。?
setMaxInactiveInterval(int?interval) 設置session的存活時間(默認存活時間是30分鐘)
void invalidate()?使此會話無效(退出網站時調用)
3、getSession():內部執行原理
HttpSession?request.getSession():內部執行原理
1、獲取名稱為JSESSIONID的Cookie的值。例如:Cookie: JSESSIONID=070BB766FAB03E03DBF28F8040CA616F
2、如果沒有這樣的Cookie,服務器則創建一個新的HttpSession對象,并分配一個唯一的SessionID,并且向客戶端寫了一個名字為JSESSIONID=sessionID的Cookie。
3、如果有這樣的Cookie,服務器則獲取Cookie的值(即HttpSession對象的值),從服務器的內存中根據ID找那個HttpSession對象:
找到了:取出繼續為你服務。
找不到:從2開始,創建一個新的HttpSession對象。
HttpSession?request.getSession(boolean?create):返回與此請求關聯的當前 HttpSession,如果沒有當前會話并且 create 為 true,則返回一個新會話。?
參數:
true:和getSession()功能一樣。
false:根據客戶端JSESSIONID的Cookie的值,找對應的HttpSession對象,找不到返回null(但不會創建新的,只是查詢)。
4、客戶端禁用Cookie后的會話數據保存問題
客戶端禁用Cookie:瀏覽器永遠不會向服務器發送Cookie的請求消息頭。
解決方案:
方案一:在主頁上給出提示:請不要禁用您的Cookie。
方案二:URL重寫。必須對網站的所有地址都重寫。??
? ? ? ? ? ? ? ?http://url? ---> http://url;JSESSIONID=070BB766FAB03E03DBF28F8040CA616F
response.encodeRedirectURL(String url);
? ? ?用于對sendRedirect方法后的url地址進行重寫。
response.encodeURL(String?url);
? 看瀏覽器有沒有發送Cookie請求消息頭,沒有就重寫URL,有就不重寫。
? 用于對表單action和超鏈接的url地址進行重寫。
request.getSession(); // 必須寫,雖然沒有接收
?
我的GitHub地址:https://github.com/heizemingjun我的博客園地址:http://www.cnblogs.com/chenmingjun
我的螞蟻筆記博客地址:http://blog.leanote.com/chenmingjun
Copyright ?2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】
總結
以上是生活随笔為你收集整理的day10_cookiesession学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在计算机中cpu指的是什么(计算机中三大
- 下一篇: dubbo配置