其他更多java基礎(chǔ)文章:
java基礎(chǔ)學(xué)習(xí)(目錄)
一苛聘、會話概述
1.1、什么是會話焰盗?
會話可簡單理解為:用戶開一個瀏覽器咒林,點擊多個超鏈接,訪問服務(wù)器多個web資源澎粟,然后關(guān)閉瀏覽器,整個過程稱之為一個會話其中不管瀏覽器發(fā)送多少請求活烙,都視為一次會話遣鼓,直到瀏覽器關(guān)閉,本次會話結(jié)束回懦。
其中注意,一個瀏覽器就相當(dāng)于一部電話怯晕,如果使用火狐瀏覽器,訪問服務(wù)器舟茶,就是一次會話了,然后打開google瀏覽器隧出,訪問服務(wù)器客燕,這是另一個會話,雖然是在同一臺電腦也搓,同一個用戶在訪問,但是幔摸,這是兩次不同的會話颤练。
1.2、會話機(jī)制
Web程序中常用的技術(shù)嗦玖,用來跟蹤用戶的整個會話。常用的會話跟蹤技術(shù)是Cookie與Session苛吱。Cookie通過在客戶端記錄信息確定用戶身份翠储,Session通過在服務(wù)器端記錄信息確定用戶身份援所。
二住拭、Cookie
Cookie是客戶端技術(shù),程序把每個用戶的數(shù)據(jù)以cookie的形式寫給用戶各自的瀏覽器。當(dāng)用戶使用瀏覽器再去訪問服務(wù)器中的web資源時,就會帶著各自的數(shù)據(jù)去寥闪。這樣,web資源處理的就是用戶各自的數(shù)據(jù)了缚柳。由于cookie是由客戶端瀏覽器保存和攜帶的,所以稱之為客戶端技術(shù)
2.1灰追、Cookie的工作流程
1)servlet創(chuàng)建cookie努咐,保存少量數(shù)據(jù)麦撵,發(fā)送瀏覽器免胃。
2)瀏覽器獲得服務(wù)器發(fā)送的cookie數(shù)據(jù)躺涝,將自動的保存到瀏覽器端坚嗜。
3)下次訪問時苍蔬,瀏覽器將自動攜帶cookie數(shù)據(jù)發(fā)送給服務(wù)器碟绑。
2.2、Cookie特點
1)每一個cookie文件大幸瓴选:4kb , 如果超過4kb瀏覽器不識別
2)一個web站點(web項目):發(fā)送20個
3)一個瀏覽器保存總大幸┗恰:300個
4)cookie 不安全便锨,可能泄露用戶信息。瀏覽器支持禁用cookie操作掸冤。
5) 默認(rèn)情況生命周期:與瀏覽器會話一樣,當(dāng)瀏覽器關(guān)閉時cookie銷毀的押赊。---臨時cookie
cookie.setMaxAge(expiry); //設(shè)置cookie被瀏覽器保存的時間罗丰。
expiry:單位秒再姑,默認(rèn)為-1,
expiry=-1:代表瀏覽器關(guān)閉后,也就是會話結(jié)束后凹联,cookie就失效了蔽挠,也就沒有了瓜浸。
expiry>0:代表瀏覽器關(guān)閉后插佛,cookie不會失效,仍然存在雇寇。并且會將cookie保存到硬盤中,直到設(shè)置時間過期才會被瀏覽器自動刪除嫩海,
expiry=0:刪除cookie叁怪。不管是之前的expiry=-1還是expiry>0,當(dāng)設(shè)置expiry=0時痴荐,cookie都會被瀏覽器給刪除。
2.3栖榨、Cookie操作
操作cookie
1)創(chuàng)建cookie:new Cookie(name,value)
2)發(fā)送cookie到瀏覽器:HttpServletResponse.addCookie(Cookie)
3)servlet接收cookie:HttpServletRequest.getCookies() 瀏覽器發(fā)送的所有cookie
cookie API
getName() 獲得名稱,cookie中的key
getValue() 獲得值愚争,cookie中的value
setValue(java.lang.String newValue) 設(shè)置內(nèi)容轰枝,用于修改key對應(yīng)的value值。
setMaxAge(int expiry) 設(shè)置有效時間【】
setPath(java.lang.String uri) 設(shè)置路徑【】
setDomain(java.lang.String pattern) 設(shè)置域名 , 一般無效步淹,有瀏覽器自動設(shè)置,setDomain(".zyh.com")
www.zyh.com / bbs.zyh.com 都可以訪問
a.b.zyh.com無法訪問
作用:設(shè)置cookie的作用范圍缭裆,域名+路徑在一起就構(gòu)成了cookie的作用范圍寿烟,上面單獨設(shè)置的setPath有用,是因為有瀏覽器自動設(shè)置該域名屬性缝其,但是我們必須知道有這么個屬性進(jìn)行域名設(shè)置的
isHttpOnly() 是否只是http協(xié)議使用徘六。只能servlet的通過getCookies()獲得,javascript不能獲得硕噩。
setComment(java.lang.String purpose) (了解) //對該cookie進(jìn)行描述的信息(說明作用),瀏覽器顯示cookie信息時能看到
setSecure(boolean flag) (了解) 是否使用安全傳輸協(xié)議辉懒。為true時谍失,只有當(dāng)是https請求連接時cookie才會發(fā)送給服務(wù)器端,而http時不會快鱼,但是服務(wù)端還是可以發(fā)送給瀏覽端的纲岭。
setVersion(int v) (了解) 參數(shù)為0(傳統(tǒng)Netscape cookie規(guī)范編譯)或1(RFC 2109規(guī)范編譯)止潮。這個沒用到,不是很懂
注意事項
cookie不能發(fā)送中文喇闸,如果要發(fā)送中文询件,就需要進(jìn)行特別處理。
Cookie cookie = new Cookie("country", URLEncoder.encode("中國", "UTF-8"));
response.addCookie(cookie);
//經(jīng)過URLEncoding就要URLDecoding
String value = URLDecoder.decode(cookies[i].getValue(), "UTF-8");
三刻蟹、Session
在WEB開發(fā)中嘿辟,服務(wù)器可以為每個用戶瀏覽器創(chuàng)建一個會話對象(session對象),注意:一個瀏覽器獨占一個session對象(默認(rèn)情況下)
因此仓洼,在需要保存用戶數(shù)據(jù)時色建,服務(wù)器程序可以把用戶數(shù)據(jù)寫到用戶瀏覽器獨占的session中舌缤,當(dāng)用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數(shù)據(jù)国撵,為用戶服務(wù)。
3.1壮虫、Session的原理
1)首先瀏覽器請求服務(wù)器訪問web站點時环础,程序需要為客戶端的請求創(chuàng)建一個session的時候,服務(wù)器首先會檢查這個客戶端請求是否已經(jīng)包含了一個session標(biāo)識线得、稱為SESSIONID
2)如果已經(jīng)包含了一個sessionid則說明以前已經(jīng)為此客戶端創(chuàng)建過session,服務(wù)器就按照sessionid把這個session檢索出來使用募狂,如果客戶端請求不包含session id,則服務(wù)器為此客戶端創(chuàng)建一個session并且生成一個與此session相關(guān)聯(lián)的session id祸穷,sessionid 的值應(yīng)該是一個既不會重復(fù),又不容易被找到規(guī)律以仿造的字符串粱哼,這個sessionid將在本次響應(yīng)中返回到客戶端保存,保存這個sessionid的方式一般就是cookie胯舷。
3)這樣在交互的過程中绊含,瀏覽器可以自動的按照規(guī)則把這個標(biāo)識發(fā)回給服務(wù)器,服務(wù)器根據(jù)這個sessionid就可以找得到對應(yīng)的session躬充,又回到了步驟1。
3.2以政、Session的生命周期
常常聽到這樣一種誤解“只要關(guān)閉瀏覽器伴找,session就消失了”。其實可以想象一下會員卡的例子技矮,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料袒炉。對session來說也是一樣的樊零,除非程序通知服務(wù)器刪除一個session,否則服務(wù)器會一直保留驻襟,程序一般都是在用戶做log off的時候發(fā)個指令去刪除session。然而瀏覽器從來不會主動在關(guān)閉之前通知服務(wù)器它將要關(guān)閉劲适,因此服務(wù)器根本不會有機(jī)會知道瀏覽器已經(jīng)關(guān)閉,之所以會有這種錯覺厢蒜,是大部分session機(jī)制都使用會話cookie來保存session id烹植,而關(guān)閉瀏覽器后這個session id就消失了草雕,再次連接服務(wù)器時也就無法找到原來的session。如果服務(wù)器設(shè)置的cookie被保存到硬盤上墩虹,或者使用某種手段改寫瀏覽器發(fā)出的HTTP請求頭憨琳,把原來的session id發(fā)送給服務(wù)器,則再次打開瀏覽器仍然能夠找到原來的session菌湃。
恰恰是由于關(guān)閉瀏覽器不會導(dǎo)致session被刪除,迫使服務(wù)器為seesion設(shè)置了一個失效時間惧所,一般是30分鐘绪杏,當(dāng)距離客戶端上一次使用session的時間超過這個失效時間時,服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動势似,才會把session刪除以節(jié)省存儲空間。Session生成后叫编,只要用戶繼續(xù)訪問霹抛,服務(wù)器就會更新Session的最后訪問時間,無論是否對Session進(jìn)行讀寫卷谈,服務(wù)器都會認(rèn)為Session活躍了一次,重新開始計算失效時間端逼。
我們也可以自己來控制session的有效時間:
session.invalidate()將session對象銷毀
setMaxInactiveInterval(int interval) 設(shè)置有效時間污淋,單位秒
在web.xml中配置session的有效時間:
<session-config>
<session-timeout>30</session-timeout> 單位:分鐘
<session-config>
所以,討論了這么久寸爆,session的生命周期就是:
創(chuàng)建:Session存儲在服務(wù)器端盐欺,一般放置在服務(wù)器的內(nèi)存中(為了高速存热呙馈)析二,Sessinon在用戶訪問第一次訪問服務(wù)器時創(chuàng)建,需要注意只有訪問JSP叶摄、Servlet等程序時才會創(chuàng)建Session,只訪問HTML挫剑、IMAGE等靜態(tài)資源并不會創(chuàng)建Session,可調(diào)用request.getSession(true)強(qiáng)制生成Session樊破。
銷毀:
1)超時唆铐,默認(rèn)30分鐘
2)執(zhí)行api:session.invalidate()將session對象銷毀、setMaxInactiveInterval(int interval) 設(shè)置有效時間顺少,單位:秒
3)服務(wù)器非正常關(guān)閉(自殺,直接將JVM馬上關(guān)閉)
如果正常關(guān)閉脆炎,session就會被持久化(寫入到文件中氓辣,因為session默認(rèn)的超時時間為30分鐘,正常關(guān)閉后钞啸,就會將session持久化,等30分鐘后梭稚,就會被刪除)
位置: D:\java\tomcat\apache-tomcat-7.0.53\work\Catalina\localhost\test01\SESSIONS.ser
3.3絮吵、session id的URL重寫
當(dāng)瀏覽器將cookie禁用,基于cookie的session將不能正常工作蹬敲,每次使用request.getSession() 都將創(chuàng)建一個新的session想幻。達(dá)不到session共享數(shù)據(jù)的目的话浇,但是我們知道原理,只需要將session id 傳遞給服務(wù)器session就可以正常工作的食店。
解決:通過URL將session id 傳遞給服務(wù)器:URL重寫
1)手動方式: url;jsessionid=....
2)api方式:
encodeURL(java.lang.String url) 進(jìn)行所有URL重寫
encodeRedirectURL(java.lang.String url) 進(jìn)行重定向 URL重寫
這兩個用法基本一致,只不過考慮特殊情況,要訪問的鏈接可能會被Redirect到其他servlet去進(jìn)行處理,這樣你用上述方法帶來的session的id信息不能被同時傳送到其他servlet赏寇。這時候用encodeRedirectURL()方法就可以了。如果瀏覽器禁用cooke自娩,api將自動追加session id ,如果沒有禁用忙迁,api將不進(jìn)行任何修改碎乃。
注意:如果瀏覽器禁用cookie,web項目的所有url都需進(jìn)行重寫梅誓。否則session將不能正常工作。
當(dāng)cookie禁用時:
四嵌言、Session和Cookie的區(qū)別
4.1及穗、從存儲方式上比較
Cookie只能存儲字符串,如果要存儲非ASCII字符串還要對其編碼拥坛。
Session可以存儲任何類型的數(shù)據(jù)尘分,可以把Session看成是一個容器
4.2、從隱私安全上比較
Cookie存儲在瀏覽器中著摔,對客戶端是可見的。信息容易泄露出去谍咆。如果使用Cookie,最好將Cookie加密
Session存儲在服務(wù)器上摹察,對客戶端是透明的。不存在敏感信息泄露問題供嚎。
4.3、從有效期上比較
Cookie保存在硬盤中克滴,只需要設(shè)置maxAge屬性為比較大的正整數(shù),即使關(guān)閉瀏覽器誓焦,Cookie還是存在的
Session的保存在服務(wù)器中着帽,設(shè)置maxInactiveInterval屬性值來確定Session的有效期。并且Session依賴于名為JSESSIONID的Cookie仍翰,該Cookie默認(rèn)的maxAge屬性為-1。如果關(guān)閉了瀏覽器傅是,該Session雖然沒有從服務(wù)器中消亡,但也就失效了喧笔。
4.4龟再、從對服務(wù)器的負(fù)擔(dān)比較
Session是保存在服務(wù)器的,每個用戶都會產(chǎn)生一個Session利凑,如果是并發(fā)訪問的用戶非常多,是不能使用Session的哀澈,Session會消耗大量的內(nèi)存。
Cookie是保存在客戶端的膨报。不占用服務(wù)器的資源。像baidu现柠、Sina這樣的大型網(wǎng)站,一般都是使用Cookie來進(jìn)行會話跟蹤比然。
4.5、從瀏覽器的支持上比較
如果瀏覽器禁用了Cookie谈秫,那么Cookie是無用的了鱼鼓!
如果瀏覽器禁用了Cookie,Session可以通過URL地址重寫來進(jìn)行會話跟蹤迄本。
4.6、從跨域名上比較
Cookie可以設(shè)置domain屬性來實現(xiàn)跨域名
Session只在當(dāng)前的域名內(nèi)有效置媳,不可夸域名