一、cookie機(jī)制和session機(jī)制的區(qū)別
具體來(lái)說(shuō)cookie機(jī)制采用的是在客戶(hù)端保持狀態(tài)的方案轧粟,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案。
同時(shí)我們也看到,由于才服務(wù)器端保持狀態(tài)的方案在客戶(hù)端也需要保存一個(gè)標(biāo)識(shí)向楼,所以session
機(jī)制可能需要借助于cookie機(jī)制來(lái)達(dá)到保存標(biāo)識(shí)的目的,但實(shí)際上還有其他選擇
二谐区、會(huì)話(huà)cookie和持久cookie的區(qū)別
如果不設(shè)置過(guò)期時(shí)間湖蜕,則表示這個(gè)cookie生命周期為瀏覽器會(huì)話(huà)期間,只要關(guān)閉瀏覽器窗口宋列,cookie就消失了昭抒。這種生命期為瀏覽會(huì)話(huà)期的cookie被稱(chēng)為會(huì)話(huà)cookie。會(huì)話(huà)cookie一般不保存在硬盤(pán)上而是保存在內(nèi)存里。
如果設(shè)置了過(guò)期時(shí)間戈鲁,瀏覽器就會(huì)把cookie保存到硬盤(pán)上仇参,關(guān)閉后再次打開(kāi)瀏覽器,這些cookie依然有效直到超過(guò)設(shè)定的過(guò)期時(shí)間婆殿。
存儲(chǔ)在硬盤(pán)上的cookie可以在不同的瀏覽器進(jìn)程間共享诈乒,比如兩個(gè)IE窗口。而對(duì)于保存在內(nèi)存的cookie婆芦,不同的瀏覽器有不同的處理方式怕磨。
三、如何利用實(shí)現(xiàn)自動(dòng)登錄
當(dāng)用戶(hù)在某個(gè)網(wǎng)站注冊(cè)后消约,就會(huì)收到一個(gè)惟一用戶(hù)ID的cookie肠鲫。客戶(hù)后來(lái)重新連接時(shí)或粮,這個(gè)
用戶(hù)ID會(huì)自動(dòng)返回导饲,服務(wù)器對(duì)它進(jìn)行檢查,確定它是否為注冊(cè)用戶(hù)且選擇了自動(dòng)登錄氯材,從而使用戶(hù)務(wù)需給出明確的用戶(hù)名和密碼渣锦,就可以訪問(wèn)服務(wù)器上的資源。
四氢哮、如何根據(jù)用戶(hù)的愛(ài)好定制站點(diǎn)
網(wǎng)站可以使用cookie記錄用戶(hù)的意愿袋毙。對(duì)于簡(jiǎn)單的設(shè)置,網(wǎng)站可以直接將頁(yè)面的設(shè)置存儲(chǔ)在cookie中完成定制冗尤。然而對(duì)于更復(fù)雜的定制听盖,網(wǎng)站只需僅將一個(gè)惟一的標(biāo)識(shí)符發(fā)送給用戶(hù),由服務(wù)器端的數(shù)據(jù)庫(kù)存儲(chǔ)每個(gè)標(biāo)識(shí)符對(duì)應(yīng)的頁(yè)面設(shè)置裂七。
五皆看、cookie的發(fā)送
1.創(chuàng)建Cookie對(duì)象
2.設(shè)置最大時(shí)效
3.將Cookie放入到HTTP響應(yīng)報(bào)頭
如果你創(chuàng)建了一個(gè)cookie,并將他發(fā)送到瀏覽器碍讯,默認(rèn)情況下它是一個(gè)會(huì)話(huà)級(jí)別的cookie:存儲(chǔ)在瀏覽器的內(nèi)存中悬蔽,用戶(hù)退出瀏覽器之后被刪除。如果你希望瀏覽器將該cookie存儲(chǔ)在磁盤(pán)上捉兴,則
需要使用maxAge蝎困,并給出一個(gè)以秒為單位的時(shí)間。將最大時(shí)效設(shè)為0則是命令瀏覽器刪除該cookie倍啥。
發(fā)送cookie需要使用HttpServletResponse的addCookie方法禾乘,將cookie插入到一個(gè)Set-Cookie HTTP請(qǐng) 求報(bào)頭中。由于這個(gè)方法并不修改任何之前指定的Set-Cookie報(bào)頭虽缕,而是創(chuàng)建新的報(bào)頭始藕,因此我們將這個(gè)方法稱(chēng)為是addCookie,而非 setCookie。同樣要記住響應(yīng)報(bào)頭必須在任何文檔內(nèi)容發(fā)送到客戶(hù)端之前設(shè)置伍派。
六互捌、cookie的讀取
1.調(diào)用request.getCookie
要獲取有瀏覽器發(fā)送來(lái)的cookie私杜,需要調(diào)用HttpServletRequest的getCookies方法,這個(gè)調(diào)用返回Cookie對(duì)象的數(shù)組,對(duì)應(yīng)由HTTP請(qǐng)求中Cookie報(bào)頭輸入的值吓坚。
2.對(duì)數(shù)組進(jìn)行循環(huán)鹃两,調(diào)用每個(gè)cookie的getName方法犁苏,直到找到感興趣的cookie為止
cookie與你的主機(jī)(域)相關(guān)场绿,而非你的servlet或JSP頁(yè)面。因而灼擂,盡管你的servlet可能只發(fā)送了單個(gè)cookie壁查,你也可能會(huì)得到許多不相關(guān)的cookie。
例如:
String cookieName = “userID”;
Cookie cookies[] = request.getCookies();
if (cookies!=null){
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
if (cookieName.equals(cookie.getName())){
doSomethingWith(cookie.getValue());
}
}
}
七剔应、如何使用cookie檢測(cè)初訪者
A.調(diào)用HttpServletRequest.getCookies()獲取Cookie數(shù)組
B.在循環(huán)中檢索指定名字的cookie是否存在以及對(duì)應(yīng)的值是否正確
C.如果是則退出循環(huán)并設(shè)置區(qū)別標(biāo)識(shí)
D.根據(jù)區(qū)別標(biāo)識(shí)判斷用戶(hù)是否為初訪者從而進(jìn)行不同的操作
八睡腿、使用cookie檢測(cè)初訪者的常見(jiàn)錯(cuò)誤
不能僅僅因?yàn)閏ookie數(shù)組中不存在在特定的數(shù)據(jù)項(xiàng)就認(rèn)為用戶(hù)是個(gè)初訪者。如果cookie數(shù)組為null领斥,客戶(hù)可能是一個(gè)初訪者嫉到,也可能是由于用戶(hù)將cookie刪除或禁用造成的結(jié)果沃暗。
但是月洛,如果數(shù)組非null,也不過(guò)是顯示客戶(hù)曾經(jīng)到過(guò)你的網(wǎng)站或域,并不能說(shuō)明他們?cè)?jīng)訪問(wèn)過(guò)你的servlet孽锥。其它servlet嚼黔、JSP頁(yè)面以及非Java Web應(yīng)用都可以設(shè)置cookie,依據(jù)路徑的設(shè)置惜辑,其中的任何cookie都有可能返回給用戶(hù)的瀏覽器唬涧。
正確的做法是判斷cookie數(shù)組是否為空且是否存在指定的Cookie對(duì)象且值正確。
九盛撑、使用cookie屬性的注意問(wèn)題
屬性是從服務(wù)器發(fā)送到瀏覽器的報(bào)頭的一部分碎节;但它們不屬于由瀏覽器返回給服務(wù)器的報(bào)頭〉治溃
因此除了名稱(chēng)和值之外狮荔,cookie屬性只適用于從服務(wù)器輸出到客戶(hù)端的cookie;服務(wù)器端來(lái)自于瀏覽器的cookie并沒(méi)有設(shè)置這些屬性介粘≈呈希
因而不要期望通過(guò)request.getCookies得到的cookie中可以使用這個(gè)屬性。這意味著姻采,你不能僅僅通過(guò)設(shè)置cookie的最大時(shí)效雅采,發(fā) 出它,在隨后的輸入數(shù)組中查找適當(dāng)?shù)腸ookie,讀取它的值,修改它并將它存回Cookie婚瓜,從而實(shí)現(xiàn)不斷改變的cookie值宝鼓。
十、如何使用cookie記錄各個(gè)用戶(hù)的訪問(wèn)計(jì)數(shù)
1.獲取cookie數(shù)組中專(zhuān)門(mén)用于統(tǒng)計(jì)用戶(hù)訪問(wèn)次數(shù)的cookie的值
2.將值轉(zhuǎn)換成int型
3.將值加1并用原來(lái)的名稱(chēng)重新創(chuàng)建一個(gè)Cookie對(duì)象
4.重新設(shè)置最大時(shí)效
5.將新的cookie輸出
十一巴刻、session在不同環(huán)境下的不同含義
session席函,中文經(jīng)常翻譯為會(huì)話(huà),其本來(lái)的含義是指有始有終的一系列動(dòng)作/消息冈涧,比如打電話(huà)是從拿起電話(huà)撥號(hào)到掛斷電話(huà)這中間的一系列過(guò)程可以稱(chēng)之為一個(gè)session茂附。
然而當(dāng)session一詞與網(wǎng)絡(luò)協(xié)議相關(guān)聯(lián)時(shí),它又往往隱含了“面向連接”和/或“保持狀態(tài)”這樣兩個(gè)含義督弓。
session在Web開(kāi)發(fā)環(huán)境下的語(yǔ)義又有了新的擴(kuò)展营曼,它的含義是指一類(lèi)用來(lái)在客戶(hù)端與服務(wù)器端之間保持狀態(tài)的解決方案。有時(shí)候Session也用來(lái)指這種解決方案的存儲(chǔ)結(jié)構(gòu)愚隧。
十二蒂阱、session的機(jī)制
session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類(lèi)似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來(lái)保存信息狂塘。
但程序需要為某個(gè)客戶(hù)端的請(qǐng)求創(chuàng)建一個(gè)session的時(shí)候录煤,服務(wù)器首先檢查這個(gè)客戶(hù)端的請(qǐng)求里是否包含了一個(gè)session標(biāo)識(shí)-稱(chēng)為session id,如果已經(jīng)包含一個(gè)session id則說(shuō)明以前已經(jīng)為此客戶(hù)創(chuàng)建過(guò)session,服務(wù)器就按照session id把這個(gè)session檢索出來(lái)使用(如果檢索不到荞胡,可能會(huì)新建一個(gè)妈踊,這種情況可能出現(xiàn)在服務(wù)端已經(jīng)刪除了該用戶(hù)對(duì)應(yīng)的session對(duì)象,但用戶(hù)人為 地在請(qǐng)求的URL后面附加上一個(gè)JSESSION的參數(shù))泪漂。
如果客戶(hù)請(qǐng)求不包含session id廊营,則為此客戶(hù)創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,這個(gè)session id將在本次響應(yīng)中返回給客戶(hù)端保存萝勤。
十三露筒、保存session id的幾種方式
A.保存session id的方式可以采用cookie,這樣在交互過(guò)程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)送給服務(wù)器敌卓。
B.由于cookie可以被人為的禁止慎式,必須有其它的機(jī)制以便在cookie被禁止時(shí)仍然能夠把session id傳遞回服務(wù)器,經(jīng)常采用的一種技術(shù)叫做URL重寫(xiě)趟径,就是把session id附加在URL路徑的后面瘪吏,附加的方式也有兩種,一種是作為URL路徑的附加信息舵抹,另一種是作為查詢(xún)字符串附加在URL后面肪虎。網(wǎng)絡(luò)在整個(gè)交互過(guò)程中始終 保持狀態(tài),就必須在每個(gè)客戶(hù)端可能請(qǐng)求的路徑后面都包含這個(gè)session id惧蛹。
C.另一種技術(shù)叫做表單隱藏字段扇救。就是服務(wù)器會(huì)自動(dòng)修改表單刑枝,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器迅腔。
十四装畅、session什么時(shí)候被創(chuàng)建
一個(gè)常見(jiàn)的錯(cuò)誤是以為session在有客戶(hù)端訪問(wèn)時(shí)就被創(chuàng)建,然而事實(shí)是直到某server端程序(如Servlet)調(diào)用HttpServletRequest.getSession(true)這樣的語(yǔ)句時(shí)才會(huì)被創(chuàng)建沧烈。
十五掠兄、session何時(shí)被刪除
session在下列情況下被刪除:
A.程序調(diào)用HttpSession.invalidate()
B.距離上一次收到客戶(hù)端發(fā)送的session id時(shí)間間隔超過(guò)了session的最大有效時(shí)間
C.服務(wù)器進(jìn)程被停止
再次注意關(guān)閉瀏覽器只會(huì)使存儲(chǔ)在客戶(hù)端瀏覽器內(nèi)存中的session cookie失效,不會(huì)使服務(wù)器端的session對(duì)象失效锌雀。
十六蚂夕、URL重寫(xiě)有什么缺點(diǎn)
對(duì)所有的URL使用URL重寫(xiě),包括超鏈接腋逆,form的action婿牍,和重定向的URL。每個(gè)引用你的站點(diǎn)的URL惩歉,以及那些返回給用戶(hù)的URL(即使通過(guò)間接手段等脂,比如服務(wù)器重定向中的Location字段)都要添加額外的信息。
這意味著在你的站點(diǎn)上不能有任何靜態(tài)的HTML頁(yè)面(至少靜態(tài)頁(yè)面中不能有任何鏈接到站點(diǎn)動(dòng)態(tài)頁(yè)面的鏈接)撑蚌。因此上遥,每個(gè)頁(yè)面都必須使用servlet或 JSP動(dòng)態(tài)生成。即使所有的頁(yè)面都動(dòng)態(tài)生成争涌,如果用戶(hù)離開(kāi)了會(huì)話(huà)并通過(guò)書(shū)簽或鏈接再次回來(lái)粉楚,會(huì)話(huà)的信息都會(huì)丟失,因?yàn)榇鎯?chǔ)下來(lái)的鏈接含有錯(cuò)誤的標(biāo)識(shí)信息- 該URL后面的SESSION ID已經(jīng)過(guò)期了第煮。
十七解幼、使用隱藏的表單域有什么缺點(diǎn)
僅當(dāng)每個(gè)頁(yè)面都是有表單提交而動(dòng)態(tài)生成時(shí),才能使用這種方法包警。單擊常規(guī)的<A HREF..>超文本鏈接并不產(chǎn)生表單提交,因此隱藏的表單域不能支持通常的會(huì)話(huà)跟蹤底靠,只能用于一系列特定的操作中害晦,比如在線商店的結(jié)賬過(guò)程
十八、會(huì)話(huà)跟蹤的基本步驟
1.訪問(wèn)與當(dāng)前請(qǐng)求相關(guān)的會(huì)話(huà)對(duì)象
2.查找與會(huì)話(huà)相關(guān)的信息
3.存儲(chǔ)會(huì)話(huà)信息
4.廢棄會(huì)話(huà)數(shù)據(jù)
十九暑中、getSession()/getSession(true)壹瘟、getSession(false)的區(qū)別
getSession()/getSession(true):當(dāng)session存在時(shí)返回該session,否則新建一個(gè)session并返回該對(duì)象
getSession(false):當(dāng)session存在時(shí)返回該session鳄逾,否則不會(huì)新建session稻轨,返回null
二十、如何將信息于會(huì)話(huà)關(guān)聯(lián)起來(lái)
setAttribute會(huì)替換任何之前設(shè)定的值雕凹;如果想要在不提供任何代替的情況下移除某個(gè)值殴俱,則應(yīng)使用removeAttribute政冻。這個(gè)方法會(huì)觸發(fā)所有實(shí)現(xiàn)了HttpSessionBindingListener接口的值的valueUnbound
方法。
二十一线欲、會(huì)話(huà)屬性的類(lèi)型有什么限制嗎
通常會(huì)話(huà)屬性的類(lèi)型只要是Object就可以了明场。除了null或基本類(lèi)型,如int,double,boolean李丰。
如果要使用基本類(lèi)型的值作為屬性苦锨,必須將其轉(zhuǎn)換為相應(yīng)的封裝類(lèi)對(duì)象
二十二、如何廢棄會(huì)話(huà)數(shù)據(jù)
A.只移除自己編寫(xiě)的servlet創(chuàng)建的數(shù)據(jù):
調(diào)用removeAttribute(“key”)將指定鍵關(guān)聯(lián)的值廢棄
B.刪除整個(gè)會(huì)話(huà)(在當(dāng)前Web應(yīng)用中):
調(diào)用invalidate趴泌,將整個(gè)會(huì)話(huà)廢棄掉舟舒。這樣做會(huì)丟失該用戶(hù)的所有會(huì)話(huà)數(shù)據(jù),而非僅僅由我們
servlet或JSP頁(yè)面創(chuàng)建的會(huì)話(huà)數(shù)據(jù)
C.將用戶(hù)從系統(tǒng)中注銷(xiāo)并刪除所有屬于他(或她)的會(huì)話(huà)
調(diào)用logOut嗜憔,將客戶(hù)從Web服務(wù)器中注銷(xiāo)魏蔗,同時(shí)廢棄所有與該用戶(hù)相關(guān)聯(lián)的會(huì)話(huà)(每個(gè)Web應(yīng)用至多一個(gè))。這個(gè)操作有可能影響到服務(wù)器上多個(gè)不同的Web應(yīng)用
二十三痹筛、使用isNew來(lái)判斷用戶(hù)是否為新舊用戶(hù)的錯(cuò)誤做法
public boolean isNew()方法如果會(huì)話(huà)尚未和客戶(hù)程序(瀏覽器)發(fā)生任何聯(lián)系莺治,則這個(gè)方法返回true,這一般是因?yàn)闀?huì)話(huà)是新建的帚稠,不是由輸入的客戶(hù)請(qǐng)求所引起的谣旁。
但如果isNew返回false,只不過(guò)是說(shuō)明他之前曾經(jīng)訪問(wèn)該Web應(yīng)用滋早,并不代表他們?cè)L問(wèn)過(guò)我們的servlet或JSP頁(yè)面榄审。
因?yàn)閟ession是與用戶(hù)相關(guān)的,在用戶(hù)之前訪問(wèn)的每一個(gè)頁(yè)面都有可能創(chuàng)建了會(huì)話(huà)杆麸。因此isNew為false只能說(shuō)用戶(hù)之前訪問(wèn)過(guò)該Web應(yīng)用搁进,session可以是當(dāng)前頁(yè)面創(chuàng)建,也可能是由用戶(hù)之前訪問(wèn)過(guò)的頁(yè)面創(chuàng)建的昔头。
正確的做法是判斷某個(gè)session中是否存在某個(gè)特定的key且其value是否正確
二十四饼问、Cookie的過(guò)期和Session的超時(shí)有什么區(qū)別
會(huì)話(huà)的超時(shí)由服務(wù)器來(lái)維護(hù),它不同于Cookie的失效日期揭斧。首先莱革,會(huì)話(huà)一般基于駐留內(nèi)存的cookie
不是持續(xù)性的cookie,因而也就沒(méi)有截至日期讹开。即使截取到JSESSIONID cookie盅视,并為它設(shè)定一個(gè)失效日期發(fā)送出去。瀏覽器會(huì)話(huà)和服務(wù)器會(huì)話(huà)也會(huì)截然不同旦万。
二十五闹击、session cookie和session對(duì)象的生命周期是一樣的嗎
當(dāng)用戶(hù)關(guān)閉了瀏覽器雖然session cookie已經(jīng)消失,但session對(duì)象仍然保存在服務(wù)器端
二十六成艘、是否只要關(guān)閉瀏覽器赏半,session就消失了
程序一般都是在用戶(hù)做log off的時(shí)候發(fā)個(gè)指令去刪除session贺归,然而瀏覽器從來(lái)不會(huì)主動(dòng)在關(guān)閉之前通知服務(wù)器它將要被關(guān)閉,因此服務(wù)器根本不會(huì)有機(jī)會(huì)知道瀏覽器已經(jīng)關(guān)閉除破。服務(wù)器會(huì)一直保留這個(gè)會(huì)話(huà)對(duì)象直到它處于非活動(dòng)狀態(tài)超過(guò)設(shè)定的間隔為止牧氮。
之所以會(huì)有這種錯(cuò)誤的認(rèn)識(shí),是因?yàn)榇蟛糠謘ession機(jī)制都使用會(huì)話(huà)cookie來(lái)保存session id瑰枫,而關(guān)閉瀏覽器后這個(gè)session id就消失了踱葛,再次連接到服務(wù)器時(shí)也就無(wú)法找到原來(lái)的session。
如果服務(wù)器設(shè)置的cookie被保存到硬盤(pán)上光坝,或者使用某種手段改寫(xiě)瀏覽器發(fā)出的HTTP請(qǐng)求報(bào)頭尸诽,把原來(lái)的session id發(fā)送到服務(wù)器,則再次打開(kāi)瀏覽器仍然能夠找到原來(lái)的session盯另。
恰恰是由于關(guān)閉瀏覽器不會(huì)導(dǎo)致session被刪除性含,迫使服務(wù)器為session設(shè)置了一個(gè)失效時(shí)間,當(dāng)距離客戶(hù)上一次使用session的時(shí)間超過(guò)了這個(gè)失效時(shí)間時(shí)鸳惯,服務(wù)器就可以認(rèn)為客戶(hù)端已經(jīng)停止了活動(dòng)商蕴,才會(huì)把session刪除以節(jié)省存儲(chǔ)空間。
由此我們可以得出如下結(jié)論:
關(guān)閉瀏覽器芝发,只會(huì)是瀏覽器端內(nèi)存里的session cookie消失绪商,但不會(huì)使保存在服務(wù)器端的session對(duì)象消失,同樣也不會(huì)使已經(jīng)保存到硬盤(pán)上的持久化cookie消失辅鲸。
二十七格郁、打開(kāi)兩個(gè)瀏覽器窗口訪問(wèn)應(yīng)用程序會(huì)使用同一個(gè)session還是不同的session
通常session cookie是不能跨窗口使用的,當(dāng)你新開(kāi)了一個(gè)瀏覽器窗口進(jìn)入相同頁(yè)面時(shí)独悴,系統(tǒng)會(huì)賦予你一個(gè)新的session id例书,這樣我們信息共享的目的就達(dá)不到了。
此時(shí)我們可以先把session id保存在persistent cookie中(通過(guò)設(shè)置session的最大有效時(shí)間)刻炒,然后在新窗口中讀出來(lái)决采,就可以得到上一個(gè)窗口的session id了,這樣通過(guò)session cookie和persistent cookie的結(jié)合我們就可以實(shí)現(xiàn)了跨窗口的會(huì)話(huà)跟蹤落蝙。
二十八织狐、如何使用會(huì)話(huà)顯示每個(gè)客戶(hù)的訪問(wèn)次數(shù)
由于客戶(hù)的訪問(wèn)次數(shù)是一個(gè)整型的變量,但session的屬性類(lèi)型中不能使用int筏勒,double,boolean等基本類(lèi)型的變量旺嬉,所以我們要用到這些基本類(lèi)型的封裝類(lèi)型對(duì)象作為session對(duì)象中屬性的值
但像Integer是一種不可修改(Immutable)的數(shù)據(jù)結(jié)構(gòu):構(gòu)建后就不能更改管行。這意味著每個(gè)請(qǐng)求都必須創(chuàng)建新的Integer對(duì)象,之后使用setAttribute來(lái)代替之前存在的老的屬性的值邪媳。例如:
HttpSession session = request.getSession();
SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);
if (value= =null){
value = new SomeImmutableClass(…); // 新創(chuàng)建一個(gè)不可更改對(duì)象
}else{
value = new SomeImmutableClass(calculatedFrom(value)); // 對(duì)value重新計(jì)算后創(chuàng)建新的對(duì)象
}
session.setAttribute(“someIdentifier”,value); // 使用新創(chuàng)建的對(duì)象覆蓋原來(lái)的老的對(duì)象
二十九捐顷、如何使用會(huì)話(huà)累計(jì)用戶(hù)的數(shù)據(jù)
使用可變的數(shù)據(jù)結(jié)構(gòu)荡陷,比如數(shù)組、List迅涮、Map或含有可寫(xiě)字段的應(yīng)用程序?qū)S械臄?shù)據(jù)結(jié)構(gòu)废赞。通過(guò)這種方式,除非首次分配對(duì)象叮姑,否則不需要調(diào)用setAttribute唉地。例如
HttpSession session = request.getSession();
SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);
if(value = = null){
value = new SomeMutableClass(…);
session.setAttribute(“someIdentifier”,value);
}else{
value.updateInternalAttribute(…); // 如果已經(jīng)存在該對(duì)象則更新其屬性而不需重新設(shè)置屬性
}
三十、不可更改對(duì)象和可更改對(duì)象在會(huì)話(huà)數(shù)據(jù)更新時(shí)的不同處理
不可更改對(duì)象因?yàn)橐坏﹦?chuàng)建之后就不能更改传透,所以每次要修改會(huì)話(huà)中屬性的值的時(shí)候耘沼,都需要
調(diào)用setAttribute(“someIdentifier”,newValue)來(lái)代替原有的屬性的值,否則屬性的值不會(huì)被更新
可更改對(duì)象因?yàn)槠渥陨硪话闾峁┝诵薷淖陨韺傩缘姆椒ㄖ煅危悦看我薷臅?huì)話(huà)中屬性的值的時(shí)
候群嗤,只要調(diào)用該可更改對(duì)象的相關(guān)修改自身屬性的方法就可以了。這意味著我們就不需要調(diào)
用setAttribute方法了