很大一部分應(yīng)該知道什么是會(huì)話機(jī)制谎碍,也能說(shuō)的出幾句,我也大概了解一點(diǎn)累盗,但是學(xué)了之后幾天不用寒矿,立馬忘的一干二凈,原因可能是沒(méi)能好好理解這兩種會(huì)話機(jī)制若债,所以會(huì)一直遺忘符相,一直重新回過(guò)頭來(lái)學(xué)習(xí)它,今天好好把他總結(jié)一下蠢琳,借鑒該文章中的內(nèi)容啊终,因?yàn)槲矣X(jué)得該篇文章確實(shí)寫(xiě)的很不錯(cuò),解答了我很多疑問(wèn)傲须,特點(diǎn)是對(duì)cookie和session的理解蓝牲,其中的會(huì)員卡的例子,真是一針見(jiàn)血的奇效泰讽。我按照自己的思路來(lái)重新整理一份例衍,給自己以后看。
一已卸、會(huì)話機(jī)制
Web程序中常用的技術(shù)佛玄,用來(lái)跟蹤用戶的整個(gè)會(huì)話。常用的會(huì)話跟蹤技術(shù)是Cookie與Session咬最。Cookie通過(guò)在客戶端記錄信息確定用戶身份翎嫡,Session通過(guò)在服務(wù)器端記錄信息確定用戶身份。
一次會(huì)話指的是:就好比打電話永乌,A給B打電話惑申,接通之后,會(huì)話開(kāi)始翅雏,直到掛斷電話圈驼,該次會(huì)話就結(jié)束了,而瀏覽器訪問(wèn)服務(wù)器望几,就跟打電話一樣绩脆,瀏覽器A給服務(wù)器發(fā)送請(qǐng)求,訪問(wèn)web程序,該次會(huì)話就已經(jīng)接通靴迫,其中不管瀏覽器發(fā)送多少請(qǐng)求(就相當(dāng)于接通電話后說(shuō)話一樣)惕味,都視為一次會(huì)話,直到瀏覽器關(guān)閉玉锌,本次會(huì)話結(jié)束名挥。其中注意,一個(gè)瀏覽器就相當(dāng)于一部電話主守,如果使用火狐瀏覽器禀倔,訪問(wèn)服務(wù)器,就是一次會(huì)話了参淫,然后打開(kāi)google瀏覽器救湖,訪問(wèn)服務(wù)器,這是另一個(gè)會(huì)話涎才,雖然是在同一臺(tái)電腦鞋既,同一個(gè)用戶在訪問(wèn),但是憔维,這是兩次不同的會(huì)話涛救。
知道了什么是會(huì)話后畏邢,思考一個(gè)問(wèn)題业扒,一個(gè)瀏覽器訪問(wèn)一個(gè)服務(wù)器就能建立一個(gè)會(huì)話,如果別的電腦舒萎,都同時(shí)訪問(wèn)該服務(wù)器程储,就會(huì)創(chuàng)建很多會(huì)話,就拿一些購(gòu)物網(wǎng)站來(lái)說(shuō)臂寝,我們?cè)L問(wèn)一個(gè)購(gòu)物網(wǎng)站的服務(wù)器章鲤,會(huì)話就被創(chuàng)建了,然后就點(diǎn)擊瀏覽商品咆贬,對(duì)感興趣的商品就先加入購(gòu)物車(chē)败徊,等待一起付賬,這看起來(lái)是很普通的操作掏缎,但是想一下皱蹦,如果有很多別的電腦上的瀏覽器同時(shí)也在訪問(wèn)該購(gòu)物網(wǎng)站的服務(wù)器,跟我們做類(lèi)似的操作呢眷蜈?服務(wù)器又是怎么記住用戶沪哺,怎么知道用戶A購(gòu)買(mǎi)的任何商品都應(yīng)該放在A的購(gòu)物車(chē)內(nèi),不論是用戶A什么時(shí)間購(gòu)買(mǎi)的酌儒,不能放入用戶B或用戶C的購(gòu)物車(chē)內(nèi)的呢辜妓?所以就有了cookie和session這兩個(gè)技術(shù),就像第一行說(shuō)的那樣,cookie和session用來(lái)跟蹤用戶的整個(gè)會(huì)話籍滴,
Cookie和Session之間的區(qū)別和聯(lián)系
假如一個(gè)咖啡店有喝5杯咖啡免費(fèi)贈(zèng)一杯咖啡的優(yōu)惠酪夷,然而一次性消費(fèi)5杯咖啡的機(jī)會(huì)微乎其微,這時(shí)就需要某種方式來(lái)紀(jì)錄某位顧客的消費(fèi)數(shù)量孽惰。想象一下其實(shí)也無(wú)外乎下面的幾種方案:
1捶索、該店的店員很厲害,能記住每位顧客的消費(fèi)數(shù)量灰瞻,只要顧客一走進(jìn)咖啡店腥例,店員就知道該怎么對(duì)待了。這種做法就是協(xié)議本身支持狀態(tài)酝润。但是http協(xié)議本身是無(wú)狀態(tài)的
2燎竖、發(fā)給顧客一張卡片,上面記錄著消費(fèi)的數(shù)量要销,一般還有個(gè)有效期限构回。每次消費(fèi)時(shí),如果顧客出示這張卡片疏咐,則此次消費(fèi)就會(huì)與以前或以后的消費(fèi)相聯(lián)系起來(lái)纤掸。這種做法就是在客戶端保持狀態(tài)。也就是cookie浑塞。 顧客就相當(dāng)于瀏覽器借跪,cookie如何工作,下面會(huì)詳細(xì)講解
3酌壕、發(fā)給顧客一張會(huì)員卡掏愁,除了卡號(hào)之外什么信息也不紀(jì)錄,每次消費(fèi)時(shí)卵牍,如果顧客出示該卡片果港,則店員在店里的紀(jì)錄本上找到這個(gè)卡號(hào)對(duì)應(yīng)的紀(jì)錄添加一些消費(fèi)信息。這種做法就是在服務(wù)器端保持狀態(tài)糊昙。
由于HTTP協(xié)議是無(wú)狀態(tài)的辛掠,而出于種種考慮也不希望使之成為有狀態(tài)的,因此释牺,后面兩種方案就成為現(xiàn)實(shí)的選擇萝衩。具體來(lái)說(shuō)cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案船侧。同時(shí)我們也看到欠气,由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí),所以session機(jī)制可能需要借助于cookie機(jī)制來(lái)達(dá)到保存標(biāo)識(shí)的目的镜撩,但實(shí)際上它還有其他選擇
二预柒、Cookie
上面已經(jīng)介紹了為什么要使用Cookie队塘,以及Cookie的一些特點(diǎn),比如保存在客戶端宜鸯,用來(lái)記錄用戶身份信息的憔古,現(xiàn)在來(lái)看看如何使用Cookie。
借著上面會(huì)員卡的例子來(lái)說(shuō)淋袖,采用的是第二種方案鸿市,其中還需要解決的問(wèn)題就是:如何分發(fā)會(huì)員卡,會(huì)員卡的內(nèi)容即碗,客戶如何使用會(huì)員卡焰情,會(huì)員卡的有效日期,會(huì)員卡的使用范圍
1剥懒、如何分發(fā)會(huì)員卡内舟、會(huì)員卡的內(nèi)容:也就是cookie是如何創(chuàng)建的?創(chuàng)建后如何發(fā)送給客戶端初橘?
由服務(wù)器進(jìn)行創(chuàng)建验游,也就相當(dāng)于咖啡店來(lái)創(chuàng)建會(huì)員卡,在創(chuàng)建會(huì)員卡的同時(shí)保檐,就會(huì)將會(huì)員卡中的內(nèi)容也給設(shè)置了
Cookie cookie = new Cookie(key,value); //以鍵值對(duì)的方式存放內(nèi)容耕蝉,
response.addCookie(cookie); //發(fā)送回瀏覽器端
注意:一旦cookie創(chuàng)建好了,就不能在往其中增加別的鍵值對(duì)夜只,但是可以修改其中的內(nèi)容垒在,
cookie.setValue(); //將key對(duì)應(yīng)的value值修改
2、客戶如何使用會(huì)員卡盐肃,cookie在客戶端是如何工作的爪膊,工作原理是什么?
這個(gè)過(guò)程就相當(dāng)于砸王,咖啡店創(chuàng)建好了會(huì)員卡,并且已經(jīng)設(shè)置了其中的內(nèi)容峦阁,交到了客戶手中谦铃,下次客戶過(guò)來(lái)時(shí),就帶著會(huì)員卡過(guò)來(lái)榔昔,就知道你是會(huì)員了驹闰,然后咖啡店就拿到你的會(huì)員卡對(duì)其進(jìn)行操作。
3撒会、會(huì)員卡的有效日期嘹朗?也就是cookie也是擁有有效日期的。
這個(gè)可以自由設(shè)置诵肛,默認(rèn)是關(guān)閉瀏覽器屹培,cookie就沒(méi)用了。
cookie.setMaxAge(expiry); //設(shè)置cookie被瀏覽器保存的時(shí)間。
expiry:?jiǎn)挝幻胪市悖J(rèn)為-1蓄诽,
expiry=-1:代表瀏覽器關(guān)閉后,也就是會(huì)話結(jié)束后媒吗,cookie就失效了仑氛,也就沒(méi)有了。
expiry>0:代表瀏覽器關(guān)閉后闸英,cookie不會(huì)失效锯岖,仍然存在叹坦。并且會(huì)將cookie保存到硬盤(pán)中炫贤,直到設(shè)置時(shí)間過(guò)期才會(huì)被瀏覽器自動(dòng)刪除,
expiry=0:刪除cookie桌硫。不管是之前的expiry=-1還是expiry>0沛豌,當(dāng)設(shè)置expiry=0時(shí)趋箩,cookie都會(huì)被瀏覽器給刪除。
4加派、會(huì)員卡的使用范圍叫确?比如星巴克在北京有一個(gè)分店,在上海也有一個(gè)分店芍锦,我們只是在北京的星巴克辦理了會(huì)員卡竹勉,那么當(dāng)我們到上海時(shí),就不能使用該會(huì)員卡進(jìn)行打折優(yōu)惠了娄琉。而cookie也是如此次乓,可以設(shè)置服務(wù)器端獲取cookie的訪問(wèn)路徑,而并非在服務(wù)器端的web項(xiàng)目中所有的servlet都能訪問(wèn)該cookie孽水。
cookie默認(rèn)路徑:當(dāng)前訪問(wèn)的servlet父路徑票腰。
例如:http://localhost:8080/test01/a/b/c/SendCookieServlet
默認(rèn)路徑:/test01/a/b/c 也就是說(shuō),在該默認(rèn)路徑下的所有Servlet都能夠獲取到cookie女气,/test01/a/b/c/MyServlet 這個(gè)MyServlet就能獲取到cookie杏慰。
修改cookie的訪問(wèn)路徑
setPath("/"); //在該服務(wù)器下炼鞠,任何項(xiàng)目缘滥,任何位置都能獲取到cookie,
通途:保證在tomcat下所有的web項(xiàng)目可以共享相同的cookie
例如:tieba , wenku , beike 多個(gè)項(xiàng)目共享數(shù)據(jù)谒主。例如用戶名朝扼。
setPath("/test01/"); //在test01項(xiàng)目下任何位置都能獲取到cookie。
5霎肯、總結(jié)Cookie:
工作流程:
1. servlet創(chuàng)建cookie擎颖,保存少量數(shù)據(jù)榛斯,發(fā)送瀏覽器。
2. 瀏覽器獲得服務(wù)器發(fā)送的cookie數(shù)據(jù)肠仪,將自動(dòng)的保存到瀏覽器端肖抱。
? 3. 下次訪問(wèn)時(shí),瀏覽器將自動(dòng)攜帶cookie數(shù)據(jù)發(fā)送給服務(wù)器异旧。
cookie操作:
1.創(chuàng)建cookie:new Cookie(name,value)
2.發(fā)送cookie到瀏覽器:HttpServletResponse.addCookie(Cookie)
3.servlet接收cookie:HttpServletRequest.getCookies() 瀏覽器發(fā)送的所有cookie
cookie特點(diǎn):
? 1. 每一個(gè)cookie文件大幸馐觥:4kb , 如果超過(guò)4kb瀏覽器不識(shí)別
? 2. 一個(gè)web站點(diǎn)(web項(xiàng)目):發(fā)送20個(gè)
? 3.一個(gè)瀏覽器保存總大兴庇肌:300個(gè)
? 4.cookie 不安全荤崇,可能泄露用戶信息。瀏覽器支持禁用cookie操作潮针。
? 5. 默認(rèn)情況生命周期:與瀏覽器會(huì)話一樣术荤,當(dāng)瀏覽器關(guān)閉時(shí)cookie銷(xiāo)毀的。---臨時(shí)cookie
cookie api:
getName() 獲得名稱(chēng)每篷,cookie中的key
getValue() 獲得值瓣戚,cookie中的value
setValue(java.lang.String newValue) 設(shè)置內(nèi)容,用于修改key對(duì)應(yīng)的value值焦读。
setMaxAge(int expiry) 設(shè)置有效時(shí)間【】
setPath(java.lang.String uri) 設(shè)置路徑【】
setDomain(java.lang.String pattern) 設(shè)置域名 , 一般無(wú)效子库,有瀏覽器自動(dòng)設(shè)置,setDomain(".itheima.com")
www.itheima.com / bbs.itheima.com 都可以訪問(wèn)
a.b.itheima.com無(wú)法訪問(wèn)
作用:設(shè)置cookie的作用范圍矗晃,域名+路徑在一起就構(gòu)成了cookie的作用范圍仑嗅,上面單獨(dú)設(shè)置的setPath有用,是因?yàn)橛袨g覽器自動(dòng)設(shè)置該域名屬性张症,但是我們必須知道有這么個(gè)屬性進(jìn)行域名設(shè)置的
isHttpOnly() 是否只是http協(xié)議使用仓技。只能servlet的通過(guò)getCookies()獲得,javascript不能獲得俗他。
setComment(java.lang.String purpose) (了解) //對(duì)該cookie進(jìn)行描述的信息(說(shuō)明作用)脖捻,瀏覽器顯示cookie信息時(shí)能看到
setSecure(boolean flag) (了解) 是否使用安全傳輸協(xié)議。為true時(shí)拯辙,只有當(dāng)是https請(qǐng)求連接時(shí)cookie才會(huì)發(fā)送給服務(wù)器端郭变,而http時(shí)不會(huì),但是服務(wù)端還是可以發(fā)送給瀏覽端的涯保。
setVersion(int v) (了解) 參數(shù)為0(傳統(tǒng)Netscape cookie規(guī)范編譯)或1(RFC 2109規(guī)范編譯)。這個(gè)沒(méi)用到周伦,不是很懂
注意:cookie不能發(fā)送中文夕春,如果要發(fā)送中文,就需要進(jìn)行特別處理专挪。
JDK提供工具及志,進(jìn)行編碼
URLEncoder:編碼
URLDecoder:解碼
//發(fā)送cookie
Cookie cookie = new Cookie(URLEncoder.encode("哈哈"),URLEncoder.encode("呵呵"));
response.addCookie(cookie);
//獲得cookie中文內(nèi)容
URLDecoder.decoder(request.getCookie().getName); //獲取key
URLDecoder.decoder(request.getCookie().getValue); //獲取value
6.cookie案例
6.1片排、記住用戶名
登錄時(shí),在服務(wù)器端獲取到用戶名速侈,然后創(chuàng)建一個(gè)cookie率寡,將用戶名存入cookie中,發(fā)送回瀏覽器端倚搬,然后瀏覽器下次在訪問(wèn)登錄頁(yè)面時(shí)冶共,先拿到cookie,將cookie中的信息拿出來(lái)每界,看是否保存了該用戶名捅僵,如果保存了,那么直接用他眨层,如果沒(méi)有庙楚,則自己手寫(xiě)用戶名。
6.2趴樱、歷史記錄
比如購(gòu)物網(wǎng)站馒闷,都會(huì)有我們的瀏覽記錄的,實(shí)現(xiàn)原理其實(shí)也是用cookie技術(shù)叁征,每瀏覽一個(gè)商品纳账,就將其存入cookie中,到需要顯示瀏覽記錄時(shí)航揉,只需要將cookie拿出來(lái)遍歷即可塞祈。
三、Session
同樣帅涂,會(huì)員卡的例子的第三種方法议薪,發(fā)給顧客一張會(huì)員卡,除了卡號(hào)之外什么信息也不紀(jì)錄媳友,每次消費(fèi)時(shí)斯议,如果顧客出示該卡片,則店員在店里的紀(jì)錄本上找到這個(gè)卡號(hào)對(duì)應(yīng)的紀(jì)錄添加一些消費(fèi)信息醇锚。這種做法就是在服務(wù)器端保持狀態(tài)哼御。 這就是session的用法焊唬,在服務(wù)器端來(lái)保持狀態(tài)恋昼,保存一些用戶信息。
功能作用:服務(wù)器用于共享數(shù)據(jù)技術(shù)赶促,
session原理分析:
首先瀏覽器請(qǐng)求服務(wù)器訪問(wèn)web站點(diǎn)時(shí)液肌,程序需要為客戶端的請(qǐng)求創(chuàng)建一個(gè)session的時(shí)候,服務(wù)器首先會(huì)檢查這個(gè)客戶端請(qǐng)求是否已經(jīng)包含了一個(gè)session標(biāo)識(shí)鸥滨、稱(chēng)為SESSIONID嗦哆,如果已經(jīng)包含了一個(gè)sessionid則說(shuō)明以前已經(jīng)為此客戶端創(chuàng)建過(guò)session谤祖,服務(wù)器就按照sessionid把這個(gè)session檢索出來(lái)使用,如果客戶端請(qǐng)求不包含session id老速,則服務(wù)器為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id粥喜,sessionid 的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串橘券,這個(gè)sessionid將在本次響應(yīng)中返回到客戶端保存额湘,保存這個(gè)sessionid的方式就可以是cookie,這樣在交互的過(guò)程中约郁,瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)回給服務(wù)器缩挑,服務(wù)器根據(jù)這個(gè)sessionid就可以找得到對(duì)應(yīng)的session,又回到了這段文字的開(kāi)始鬓梅。
獲取session:
request.getSession(); //如果沒(méi)有將創(chuàng)建一個(gè)新的供置,等效getSession(true);
有些人不理解,為什么是通過(guò)request來(lái)獲取session绽快,可以這樣理解芥丧,在獲取session時(shí),需要檢測(cè)請(qǐng)求中是否有session標(biāo)識(shí)坊罢,所以需要用request來(lái)獲取
request.getSession(boolean); //true:沒(méi)有將創(chuàng)建续担,false:沒(méi)有將返回null
session屬性操作:
xxxAttribute(...)
用來(lái)存放一些信息,然后才能共享信息
setAttrubute(key,value);
getAttribute(key);
session生命周期
常常聽(tīng)到這樣一種誤解“只要關(guān)閉瀏覽器活孩,session就消失了”物遇。其實(shí)可以想象一下會(huì)員卡的例子,除非顧客主動(dòng)對(duì)店家提出銷(xiāo)卡憾儒,否則店家絕對(duì)不會(huì)輕易刪除顧客的資料询兴。對(duì)session來(lái)說(shuō)也是一樣的,除非程序通知服務(wù)器刪除一個(gè)session起趾,否則服務(wù)器會(huì)一直保留诗舰,程序一般都是在用戶做log off的時(shí)候發(fā)個(gè)指令去刪除session。然而瀏覽器從來(lái)不會(huì)主動(dòng)在關(guān)閉之前通知服務(wù)器它將要關(guān)閉训裆,因此服務(wù)器根本不會(huì)有機(jī)會(huì)知道瀏覽器已經(jīng)關(guān)閉眶根,之所以會(huì)有這種錯(cuò)覺(jué),是大部分session機(jī)制都使用會(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)求頭诸老,把原來(lái)的session id發(fā)送給服務(wù)器,則再次打開(kāi)瀏覽器仍然能夠找到原來(lái)的session
恰恰是由于關(guān)閉瀏覽器不會(huì)導(dǎo)致session被刪除钳恕,迫使服務(wù)器為seesion設(shè)置了一個(gè)失效時(shí)間别伏,一般是30分鐘,當(dāng)距離客戶端上一次使用session的時(shí)間超過(guò)這個(gè)失效時(shí)間時(shí)忧额,服務(wù)器就可以認(rèn)為客戶端已經(jīng)停止了活動(dòng)厘肮,才會(huì)把session刪除以節(jié)省存儲(chǔ)空間
我們也可以自己來(lái)控制session的有效時(shí)間
session.invalidate()將session對(duì)象銷(xiāo)毀
setMaxInactiveInterval(int interval) 設(shè)置有效時(shí)間,單位秒
在web.xml中配置session的有效時(shí)間
<session-config>
<session-timeout>30</session-timeout> 單位:分鐘
<session-config>
所以睦番,討論了這么就类茂,session的生命周期就是:
創(chuàng)建:第一次調(diào)用getSession()
銷(xiāo)毀:
1、超時(shí)托嚣,默認(rèn)30分鐘
2巩检、執(zhí)行api:session.invalidate()將session對(duì)象銷(xiāo)毀、setMaxInactiveInterval(int interval) 設(shè)置有效時(shí)間示启,單位秒
3兢哭、服務(wù)器非正常關(guān)閉
自殺,直接將JVM馬上關(guān)閉
如果正常關(guān)閉夫嗓,session就會(huì)被持久化(寫(xiě)入到文件中迟螺,因?yàn)閟ession默認(rèn)的超時(shí)時(shí)間為30分鐘,正常關(guān)閉后舍咖,就會(huì)將session持久化矩父,等30分鐘后,就會(huì)被刪除)
位置: D:\java\tomcat\apache-tomcat-7.0.53\work\Catalina\localhost\test01\SESSIONS.ser
session id的URL重寫(xiě)
當(dāng)瀏覽器將cookie禁用排霉,基于cookie的session將不能正常工作窍株,每次使用request.getSession() 都將創(chuàng)建一個(gè)新的session。達(dá)不到session共享數(shù)據(jù)的目的攻柠,但是我們知道原理球订,只需要將session id 傳遞給服務(wù)器session就可以正常工作的。
解決:通過(guò)URL將session id 傳遞給服務(wù)器:URL重寫(xiě)
手動(dòng)方式: url;jsessionid=....
api方式:
encodeURL(java.lang.String url) 進(jìn)行所有URL重寫(xiě)
encodeRedirectURL(java.lang.String url) 進(jìn)行重定向 URL重寫(xiě)
這兩個(gè)用法基本一致,只不過(guò)考慮特殊情況,要訪問(wèn)的鏈接可能會(huì)被Redirect到其他servlet去進(jìn)行處理,這樣你用上述方法帶來(lái)的session的id信息不能被同時(shí)傳送到其他servlet.這時(shí)候用encodeRedirectURL()方法就可以了
如果瀏覽器禁用cooke辙诞,api將自動(dòng)追加session id 辙售,如果沒(méi)有禁用,api將不進(jìn)行任何修改飞涂。
注意:如果瀏覽器禁用cookie旦部,web項(xiàng)目的所有url都需進(jìn)行重寫(xiě)。否則session將不能正常工作
當(dāng)禁止了cookie時(shí)较店,
Session的客戶端實(shí)現(xiàn)形式(即Session ID的保存方法):
一般瀏覽器提供了兩種方式來(lái)保存士八,還有一種是程序員使用html隱藏域的方式自定義實(shí)現(xiàn):
[1] 使用Cookie來(lái)保存,這是最常見(jiàn)的方法梁呈,本文“記住我的登錄狀態(tài)”功能的實(shí)現(xiàn)正式基于這種方式的婚度。
服務(wù)器通過(guò)設(shè)置Cookie的方式將Session ID發(fā)送到瀏覽器。
如果我們不設(shè)置這個(gè)過(guò)期時(shí)間官卡,那么這個(gè)Cookie將不存放在硬盤(pán)上蝗茁,當(dāng)瀏覽器關(guān)閉的時(shí)候醋虏,Cookie就消失了,這個(gè)Session ID就丟失了哮翘。
如果我們?cè)O(shè)置這個(gè)時(shí)間為若干天之后颈嚼,那么這個(gè)Cookie會(huì)保存在客戶端硬盤(pán)中,即使瀏覽器關(guān)閉饭寺,這個(gè)值仍然存在阻课,下次訪問(wèn)相應(yīng)網(wǎng)站時(shí),同 樣會(huì)發(fā)送到服務(wù)器上艰匙。
[2] 使用URL附加信息的方式限煞,也就是像我們經(jīng)常看到JSP網(wǎng)站會(huì)有aaa.jsp?JSESSIONID=*一樣的员凝。這種方式和第一種方式里面不設(shè)置Cookie過(guò)期時(shí)間是一樣的署驻。(URL重寫(xiě),就是把session id直接附加在URL路徑的后面绊序。)
[3] 第三種方式是在頁(yè)面表單里面增加隱藏域硕舆,這種方式實(shí)際上和第二種方式一樣,只不過(guò)前者通過(guò)GET方式發(fā)送數(shù)據(jù)骤公,后者使用POST方式發(fā)送數(shù)據(jù)抚官。但是明顯后者比較麻煩。
表單隱藏字段就是服務(wù)器會(huì)自動(dòng)修改表單阶捆,添加一個(gè)隱藏字段凌节,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。比如:
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
實(shí)際上這種技術(shù)可以簡(jiǎn)單的用對(duì)action應(yīng)用URL重寫(xiě)來(lái)代替洒试。
四倍奢、總結(jié)
知道了什么是cookie和什么是session?
cookie是一種在客戶端記錄用戶信息的技術(shù)垒棋,因?yàn)閔ttp協(xié)議是無(wú)狀態(tài)的卒煞,為了解決這個(gè)問(wèn)題而產(chǎn)生了cookie。記錄用戶名等一些應(yīng)用
session是一種在服務(wù)端記錄用戶信息的技術(shù)叼架,一般session用來(lái)在服務(wù)器端共享數(shù)據(jù)畔裕,
cookie的工作原理?session的工作原理乖订?
cookie工作原理扮饶,可以看上面講解cookie的那張圖,cookie是由服務(wù)器端創(chuàng)建發(fā)送回瀏覽器端的乍构,并且每次請(qǐng)求服務(wù)器都會(huì)將cookie帶過(guò)去甜无,以便服務(wù)器知道該用戶是哪一個(gè)。其cookie中是使用鍵值對(duì)來(lái)存儲(chǔ)信息的,并且一個(gè)cookie只能存儲(chǔ)一個(gè)鍵值對(duì)岂丘。所以在獲取cookie時(shí)陵究,是會(huì)獲取到所有的cookie,然后從其中遍歷元潘。
session的工作原理就是依靠cookie來(lái)做支撐畔乙,第一次使用request.getSession()時(shí)session被創(chuàng)建,并且會(huì)為該session創(chuàng)建一個(gè)獨(dú)一無(wú)二的sessionid存放到cookie中翩概,然后發(fā)送會(huì)瀏覽器端,瀏覽器端每次請(qǐng)求時(shí)返咱,都會(huì)帶著這個(gè)sessionid钥庇,服務(wù)器就會(huì)認(rèn)識(shí)該sessionid,知道了sessionid就找得到哪個(gè)session咖摹。以此來(lái)達(dá)到共享數(shù)據(jù)的目的评姨。 這里需要注意的是,session不會(huì)隨著瀏覽器的關(guān)閉而死亡萤晴,而是等待超時(shí)時(shí)間吐句。
如果對(duì)cookie和session還有不理解的地方,用大家肯定都會(huì)用店读,就是需要理解嗦枢,為什么需要使用cookie和session,可以看看那個(gè)會(huì)員卡的例子屯断,cookie和session只是為了解決http協(xié)議無(wú)狀態(tài)的這種缺陷文虏,為了記錄用戶信息,記錄瀏覽器和服務(wù)器之間的狀態(tài)和衍生出來(lái)的殖演。