Cookie 與 Session 理解

很大一部分應(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在客戶端是如何工作的爪膊,工作原理是什么?

img

這個(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ù)赶促,

img

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í)较店,

img

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,然后從其中遍歷元潘。

img

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)的殖演。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末氧秘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趴久,更是在濱河造成了極大的恐慌丸相,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彼棍,死亡現(xiàn)場(chǎng)離奇詭異灭忠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)滥酥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)更舞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坎吻,你說(shuō)我怎么就攤上這事缆蝉。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵刊头,是天一觀的道長(zhǎng)黍瞧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)原杂,這世上最難降的妖魔是什么印颤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮穿肄,結(jié)果婚禮上年局,老公的妹妹穿的比我還像新娘。我一直安慰自己咸产,他們只是感情好矢否,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脑溢,像睡著了一般僵朗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屑彻,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天验庙,我揣著相機(jī)與錄音,去河邊找鬼社牲。 笑死粪薛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膳沽。 我是一名探鬼主播汗菜,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挑社!你這毒婦竟也來(lái)了陨界?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤痛阻,失蹤者是張志新(化名)和其女友劉穎菌瘪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阱当,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俏扩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弊添。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片录淡。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖油坝,靈堂內(nèi)的尸體忽然破棺而出嫉戚,到底是詐尸還是另有隱情刨裆,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布彬檀,位于F島的核電站帆啃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窍帝。R本人自食惡果不足惜努潘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坤学。 院中可真熱鬧疯坤,春花似錦、人聲如沸拥峦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)略号。三九已至,卻和暖如春洋闽,著一層夾襖步出監(jiān)牢的瞬間玄柠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工诫舅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羽利,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓刊懈,卻偏偏與公主長(zhǎng)得像这弧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虚汛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 目錄Cookie機(jī)制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 16,946評(píng)論 7 186
  • 轉(zhuǎn)自 :http://blog.csdn.net/taoff/articles/1921009.aspx 一匾浪、術(shù)語(yǔ)...
    stone_yao閱讀 6,190評(píng)論 0 31
  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù),用來(lái)跟蹤用戶的整個(gè)會(huì)話卷哩。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,620評(píng)論 1 49
  • 1. cookie 1.1 什么是cookie cookie 是存儲(chǔ)于訪問(wèn)者的計(jì)算機(jī)中的變量蛋辈。每當(dāng)同一臺(tái)計(jì)算機(jī)通過(guò)...
    cbw100閱讀 4,060評(píng)論 0 13
  • 我把我們的愛(ài)寫(xiě)在一本書(shū)里 你可以時(shí)不時(shí)翻來(lái)溫習(xí) 樹(shù)流下的淚凝成琥珀 留給回不去的昨日 半年前的記憶其實(shí) 也可以沿路...
    哆啦A念閱讀 189評(píng)論 0 2