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