java基礎(chǔ)學(xué)習(xí):JavaWeb之Cookie和Session

其他更多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禁用時:


image.png

四嵌言、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)有效置媳,不可夸域名

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末公条,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寥袭,更是在濱河造成了極大的恐慌,老刑警劉巖传黄,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件队寇,死亡現(xiàn)場離奇詭異,居然都是意外死亡识埋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門窒舟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辜纲,“玉大人,你說我怎么就攤上這事耕腾。” “怎么了扫俺?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵狼纬,是天一觀的道長。 經(jīng)常有香客問我疗琉,道長,這世上最難降的妖魔是什么盈简? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任太示,我火速辦了婚禮,結(jié)果婚禮上臼勉,老公的妹妹穿的比我還像新娘。我一直安慰自己宴霸,他們只是感情好膏蚓,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恩闻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幢尚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天尉剩,我揣著相機(jī)與錄音毅臊,去河邊找鬼。 笑死皂林,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的础倍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忆家,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芽卿?” 一聲冷哼從身側(cè)響起胳搞,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎流酬,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旦装,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡摊滔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了呻袭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡左电,死狀恐怖页响,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闰蚕,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布涩哟,位于F島的核電站索赏,受9級特大地震影響潜腻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砾赔,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一青灼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杂拨,春花似錦、人聲如沸弹沽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娜亿。三九已至,卻和暖如春买决,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背督赤。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留丑婿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓枯冈,卻偏偏與公主長得像办悟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子病蛉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354