摘要:的作用就是為了解決協(xié)議無(wú)狀態(tài)的缺陷所作的努力。的內(nèi)容主要包括名字,值,過(guò)期時(shí)間,路徑和域。這種生命期為瀏覽器會(huì)話(huà)期的被稱(chēng)為會(huì)話(huà)。而機(jī)制采用的是一種在服務(wù)器端保持狀態(tài)的解決方案。中的有效期默認(rèn)分鐘,也就是說(shuō),客戶(hù)端超過(guò)分鐘,當(dāng)前就會(huì)失效。
會(huì)話(huà)控制是什么?
cookie和session都是跟蹤整個(gè)會(huì)話(huà)過(guò)程的技術(shù)手段。而會(huì)話(huà),就是用戶(hù)通過(guò)瀏覽器和服務(wù)器的一次通話(huà)。
為什么要有會(huì)話(huà)控制?因?yàn)镠TTP協(xié)議是無(wú)狀態(tài)的,服務(wù)器不知道用戶(hù)上一次做了什么,這嚴(yán)重阻礙了交互式web應(yīng)用程序的實(shí)現(xiàn)。HTTP不通過(guò)額外的手段,服務(wù)器并不知道用戶(hù)做了什么,為了做到這一點(diǎn),就需要使用cookie和session了。服務(wù)器可以設(shè)置或者讀取cookie中包含信息,借此維護(hù)用戶(hù)跟服務(wù)器會(huì)話(huà)中的狀態(tài)。
※session的工作原理(運(yùn)行機(jī)制)? cookie的工作原理?cookie工作原理
cookie分為兩種
以文件方式存在硬盤(pán)空間上的持久cookie(網(wǎng)站的【記住密碼】【自動(dòng)登錄】功能都是持久cookie)
存在瀏覽器中占用內(nèi)存的臨時(shí)cookie
cookie采用的是在客戶(hù)端保持狀態(tài)的方案,它是客戶(hù)端的會(huì)話(huà)狀態(tài)的一種儲(chǔ)存機(jī)制。它是服務(wù)器在本地機(jī)器上存儲(chǔ)的小段文本或者是內(nèi)存中的一段數(shù)據(jù),并隨每一個(gè)請(qǐng)求發(fā)送至同一個(gè)服務(wù)器 .
cookie工作原理::::
cookie的工作原理,這需要有基本的HTTP協(xié)議基礎(chǔ)。
cookie是在RFC2109(已廢棄,被RFC2965取代)里初次被描述的,每個(gè)客戶(hù)端最多保持三百個(gè)cookie,每個(gè)域名下最多20個(gè)Cookie(實(shí)際上一般瀏覽器現(xiàn)在都比這個(gè)多,如Firefox是50個(gè)),而每個(gè)cookie的大小為最多4K,不過(guò)不同的瀏覽器都有各自的實(shí)現(xiàn)。對(duì)于cookie的使用,最重要的就是要控制cookie的大小,不要放入無(wú)用的信息,也不要放入過(guò)多信息。
無(wú)論使用何種服務(wù)端技術(shù),只要發(fā)送回的HTTP響應(yīng)中包含如下形式的頭,則視為服務(wù)器要求設(shè)置一個(gè)cookie:
Set-cookie:name=name;expires=date;path=path;domain=domain
支持cookie的瀏覽器都會(huì)對(duì)此作出反應(yīng),即創(chuàng)建cookie文件并保存(也可能是內(nèi)存cookie),用戶(hù)以后在每次發(fā)出請(qǐng)求時(shí),瀏覽器都要判斷當(dāng)前所有的cookie中有沒(méi)有沒(méi)失效(根據(jù)expires屬性判斷)并且匹配了path屬性的cookie信息,如果有的話(huà),會(huì)以下面的形式加入到請(qǐng)求頭中發(fā)回服務(wù)端: Cookie: name="zj"; Path="/linkage" 服務(wù)端的動(dòng)態(tài)腳本會(huì)對(duì)其進(jìn)行分析,并做出相應(yīng)的處理,當(dāng)然也可以選擇直接忽略。
cookie機(jī)制Cookies是服務(wù)器在本地機(jī)器上存儲(chǔ)的小段文本并隨每一個(gè)請(qǐng)求發(fā)送至同一個(gè)服務(wù)器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie規(guī)范。網(wǎng)絡(luò)服務(wù)器用HTTP頭向客戶(hù)端發(fā)送cookies,在客戶(hù)終端,瀏覽器解析這些cookies并將它們保存為一個(gè)本地文件,它會(huì)自動(dòng)將同一服務(wù)器的任何請(qǐng)求縛上這些cookies 。
具體來(lái)說(shuō)cookie機(jī)制采用的是在客戶(hù)端保持狀態(tài)的方案。它是在用戶(hù)端的會(huì)話(huà)狀態(tài)的存貯機(jī)制,他需要用戶(hù)打開(kāi)客戶(hù)端的cookie支持。cookie的作用就是為了解決HTTP協(xié)議無(wú)狀態(tài)的缺陷所作的努力。
正統(tǒng)的cookie分發(fā)是通過(guò)擴(kuò)展HTTP協(xié)議來(lái)實(shí)現(xiàn)的,服務(wù)器通過(guò)在HTTP的響應(yīng)頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應(yīng)的cookie。然而純粹的客戶(hù)端腳本如JavaScript也可以生成cookie。而cookie的使用是由瀏覽器按照一定的原則在后臺(tái)自動(dòng)發(fā)送給服務(wù)器的。瀏覽器檢查所有存儲(chǔ)的cookie,如果某個(gè)cookie所聲明的作用范圍大于等于將要請(qǐng)求的資源所在的位置,則把該cookie附在請(qǐng)求資源的HTTP請(qǐng)求頭上發(fā)送給服務(wù)器。
cookie的內(nèi)容主要包括:名字,值,過(guò)期時(shí)間,路徑和域。路徑與域一起構(gòu)成cookie的作用范圍。若不設(shè)置過(guò)期時(shí)間,則表示這個(gè)cookie的生命期為瀏覽器會(huì)話(huà)期間,關(guān)閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會(huì)話(huà)期的cookie被稱(chēng)為會(huì)話(huà)cookie。會(huì)話(huà)cookie一般不存儲(chǔ)在硬盤(pán)上而是保存在內(nèi)存里,當(dāng)然這種行為并不是規(guī)范規(guī)定的。若設(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,不同的瀏覽器有不同的處理方式。
而session機(jī)制采用的是一種在服務(wù)器端保持狀態(tài)的解決方案。同時(shí)我們也看到,由于采用服務(wù)器端保持狀態(tài)的方案在客戶(hù)端也需要保存一個(gè)標(biāo)識(shí),所以session機(jī)制可能需要借助于cookie機(jī)制來(lái)達(dá)到保存標(biāo)識(shí)的目的。而session提供了方便管理全局變量的方式 。
session是針對(duì)每一個(gè)用戶(hù)的,變量的值保存在服務(wù)器上,用一個(gè)sessionID來(lái)區(qū)分是哪個(gè)用戶(hù)session變量,這個(gè)值是通過(guò)用戶(hù)的瀏覽器在訪(fǎng)問(wèn)的時(shí)候返回給服務(wù)器,當(dāng)客戶(hù)禁用cookie時(shí),這個(gè)值也可能設(shè)置為由get來(lái)返回給服務(wù)器。
就安全性來(lái)說(shuō):當(dāng)你訪(fǎng)問(wèn)一個(gè)使用session 的站點(diǎn),同時(shí)在自己機(jī)子上建立一個(gè)cookie,建議在服務(wù)器端的session機(jī)制更安全些,因?yàn)樗粫?huì)任意讀取客戶(hù)存儲(chǔ)的信息。
session的工作原理?默認(rèn)情況下所有的用戶(hù)信息都存放在服務(wù)器的硬盤(pán)中。但是可以用memcache把這些數(shù)據(jù)放在內(nèi)存中。
當(dāng)客戶(hù)端向服務(wù)器發(fā)出請(qǐng)求時(shí),要求服務(wù)器端產(chǎn)生一個(gè) session時(shí),服務(wù)器端會(huì)先檢查一下,客戶(hù)端的 cookie里面有沒(méi)有session_id,是否已經(jīng)過(guò)期。如果有這樣的 session_id的話(huà),服務(wù)器端會(huì)根據(jù)cookie里的session_id 把服務(wù)器的 session檢索出來(lái)。如果沒(méi)有這樣的session_id的話(huà),服務(wù)器端會(huì)重新建立一個(gè)。 PHPSESSID是一串加了密的字符串,它的生成按照一定的規(guī)則來(lái)執(zhí)行。同一客戶(hù)端啟動(dòng)二次session_start的話(huà),session_id是不一樣的。
由于采用服務(wù)器端保持狀態(tài)的方案在客戶(hù)端也需要保存一個(gè)標(biāo)識(shí),所以 session機(jī)制借助于cookie 機(jī)制來(lái)達(dá)到保存標(biāo)識(shí)的目的
session產(chǎn)生的session_id 放在cookie里面,如果用戶(hù)把 cookie禁止掉,是不是session也不能用了呢?禁止掉 cookie后,session 當(dāng)然可以用,不過(guò)通過(guò)其他的方式來(lái)獲得這個(gè) sessionid,比如,可以根在url的后面,或者以表單的形勢(shì)提交到服務(wù)器端。從而使服務(wù)器端了解客戶(hù)端的狀態(tài)。
再看一下session的原理:
生成全局唯一標(biāo)識(shí)符(sessionid);
開(kāi)辟數(shù)據(jù)存儲(chǔ)空間。一般會(huì)在內(nèi)存中創(chuàng)建相應(yīng)的數(shù)據(jù)結(jié)構(gòu),但這種情況下,系統(tǒng)一旦掉電,所有的會(huì)話(huà)數(shù)據(jù)就會(huì)丟失,如果是電子商務(wù)網(wǎng)站,這種事故會(huì)造成嚴(yán)重的后果。不過(guò)也可以寫(xiě)到文件里甚至存儲(chǔ)在數(shù)據(jù)庫(kù)中,這樣雖然會(huì)增加I/O開(kāi)銷(xiāo),但session可以實(shí)現(xiàn)某種程度的持久化,而且更有利于session的共享;
將session的全局唯一標(biāo)示符發(fā)送給客戶(hù)端。
session機(jī)制
session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類(lèi)似于哈希表的結(jié)構(gòu)(也可能就是使用哈希表)來(lái)保存信息。
當(dāng)程序需要為某個(gè)客戶(hù)端的請(qǐng)求創(chuàng)建一個(gè)session時(shí),服務(wù)器首先檢查這個(gè)客戶(hù)端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí)(稱(chēng)為session id),如果已包含則說(shuō)明以前已經(jīng)為此客戶(hù)端創(chuàng)建過(guò)session,服務(wù)器就按照session id把這個(gè)session檢索出來(lái)使用(檢索不到,會(huì)新建一個(gè)),如果客戶(hù)端請(qǐng)求不包含session id,則為此客戶(hù)端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,session id的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)session id將被在本次響應(yīng)中返回給客戶(hù)端保存。
保存這個(gè)session id的方式可以采用cookie,這樣在交互過(guò)程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)揮給服務(wù)器。一般這個(gè)cookie的名字都是類(lèi)似于SEEESIONID。但cookie可以被人為的禁止,則必須有其他機(jī)制以便在cookie被禁止時(shí)仍然能夠把session id傳遞回服務(wù)器。
經(jīng)常被使用的一種技術(shù)叫做URL重寫(xiě),就是把session id直接附加在URL路徑的后面。還有一種技術(shù)叫做表單隱藏字段。就是服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器。
Cookie與Session都能夠進(jìn)行會(huì)話(huà)跟蹤,但是完成的原理不太一樣。普通狀況下二者均能夠滿(mǎn)足需求,但有時(shí)分不能夠運(yùn)用Cookie,有時(shí)分不能夠運(yùn)用Session。下面經(jīng)過(guò)比擬闡明二者的特性以及適用的場(chǎng)所。
session的運(yùn)行機(jī)制?當(dāng)一個(gè)Session開(kāi)始時(shí),Servlet容器會(huì)創(chuàng)建一個(gè)HttpSession對(duì)象,那么在HttpSession對(duì)象中,可以存放用戶(hù)狀態(tài)的信息
Servlet容器為HttpSession對(duì)象分配一個(gè)唯一標(biāo)識(shí)符即Sessionid,Servlet容器把Sessionid作為一種Cookie保存在客戶(hù)端的 瀏覽器 中
用戶(hù)每次發(fā)出Http請(qǐng)求時(shí),Servlet容器會(huì)從HttpServletRequest對(duì)象中取出Sessionid,然后根據(jù)這個(gè)Sessionid找到相應(yīng)的HttpSession對(duì)象,從而獲取用戶(hù)的狀態(tài)信息
session的生命周期(有效期)?cookie生命周期:
如果cookie不設(shè)定時(shí)間的話(huà)就表視它的生命周期為瀏覽器會(huì)話(huà)的期間,只要關(guān)閉瀏覽器,cookie就消失了。如果設(shè)置了cokie的過(guò)期時(shí)間.那么瀏覽器會(huì)把cookie保存到硬盤(pán)中,再次打IE時(shí)會(huì)依然有效.直到超過(guò)設(shè)置的有效期,$.cookie(key, value, {path:"/", expire: new Date("2017-01-01")}) 設(shè)置過(guò)期時(shí)間。注:存儲(chǔ)在硬盤(pán)中的cookie可以在不同IE間共享。
session生命周期:
服務(wù)器會(huì)把長(zhǎng)時(shí)間沒(méi)有活動(dòng)的Session從服務(wù)器內(nèi)存中清除,此時(shí)Session便失效。Tomcat中Session的默認(rèn)失效時(shí)間為20分鐘。調(diào)用Session的invalidate方法。注:當(dāng)禁用cookie時(shí)也是不能使用session的。
PHP中的session有效期默認(rèn)24分鐘,也就是說(shuō),客戶(hù)端超過(guò)24分鐘,當(dāng)前session就會(huì)失效。當(dāng)然,也可以通過(guò)session.gc_maxlifetime修改。
session的垃圾回收機(jī)制?每一次php請(qǐng)求,會(huì)有1/100的概率(默認(rèn)值)觸發(fā)“session回收”。如果“session回收”發(fā)生,那就會(huì)檢查
/tmp/sess_*的文件,如果最后的修改時(shí)間到現(xiàn)在超過(guò)了1440秒(gc_maxlifetime的值),就將其刪除,意味著這些session過(guò)期失效。
由于PHP的工作機(jī)制,它并沒(méi)有一個(gè)daemon線(xiàn)程,來(lái)定時(shí)地掃描session信息并判斷其是否失效。當(dāng)一個(gè)有效請(qǐng)求發(fā)生時(shí),PHP會(huì)根據(jù)全局變量session.gc_probability/session.gc_divisor(同樣可以通過(guò)php.ini或者ini_set()函數(shù)來(lái)修改)的值,來(lái)決定是否啟動(dòng)一個(gè)GC(Garbage Collector)。默認(rèn)情況下,session.gc_probability =1,session.gc_divisor =100,也就是說(shuō)有1%的可能性會(huì)啟動(dòng)GC。
GC 的工作,就是掃描所有的session信息,用當(dāng)前時(shí)間減去session的最后修改時(shí)間(modifieddate),同session.gc_maxlifetime參數(shù)進(jìn)行比較,如果生存時(shí)間已經(jīng)超過(guò)gc_maxlifetime,就把該session刪除。
默認(rèn)情況下,每一次php請(qǐng)求,就會(huì)有1/100的概率發(fā)生回收,所以可能簡(jiǎn)單的理解為“每100次php請(qǐng)求就有一次回收發(fā)生”。這個(gè)概率是通過(guò)以下參數(shù)控制的
概率是gc_probability/gc_divisor
session.gc_probability = 1
session.gc_divisor = 100
注意1:假設(shè)這種情況gc_maxlifetime=120,如果某個(gè)session文件最后修改時(shí)間是120秒之前,那么在下一次回收(1/100的概率)發(fā)生前,這個(gè)session仍然是有效的。
注意2:如果你的session使用session.save_path中使用別的地方保存session,session回收機(jī)制有可能不會(huì)自動(dòng)處理過(guò)期session文件。這時(shí)需要定時(shí)手動(dòng)(或者crontab)的刪除過(guò)期的session:cd /path/to/sessions; find -cmin +24 | xargs rm
session.gc_maxlifetime
session.gc_probability
session.gc_divisor
session.gc_divisor 與 session.gc_probability 合起來(lái)定義了在每個(gè)會(huì)話(huà)初始化時(shí)啟動(dòng) gc(garbage collection 垃圾回收)進(jìn)程的概率。此概率用 gc_probability/gc_divisor 計(jì)算得來(lái)。例如 1/100 意味著在每個(gè)請(qǐng)求中有 1% 的概率啟動(dòng) gc 進(jìn)程。session.gc_divisor 默認(rèn)為 100。
比如:session.gc_maxlifetime=30,session.gc_divisor=1000,session.gc_probability=1,就表示每一千個(gè)用戶(hù)調(diào)用session_start()的時(shí)候,就百分百的會(huì)執(zhí)行一次垃圾回收機(jī)制,將磁盤(pán)上沒(méi)用的session文件刪除。
注意:一般對(duì)于一些大型的門(mén)戶(hù)網(wǎng)站,建議將session.gc_divisor調(diào)大一點(diǎn),減少開(kāi)銷(xiāo)
接下來(lái),我通過(guò)一個(gè)例子演示下,如何配置才能讓調(diào)用gc(垃圾回收)進(jìn)程呢!
通過(guò)配置php.ini文件,修改以下幾個(gè)信息:
session.gc_maxlifetime = 60//當(dāng)session文件在60s后還沒(méi)有被訪(fǎng)問(wèn)的話(huà),則該session文件將會(huì)被視為“垃圾文件”,并且等待gc(垃圾回收)進(jìn)程的調(diào)用的時(shí)候被清理掉
session.gc_probability = 1000
因?yàn)間c進(jìn)程被調(diào)用的概率是通過(guò)gc_probability/gc_divisor 計(jì)算得來(lái)的,這里我將session.gc_probability改成1000,而session.gc_divisor 默認(rèn)情況下也是1000。則gc進(jìn)程在每次執(zhí)行session_start()函數(shù)的時(shí)候都會(huì)被調(diào)用到。
以下我通過(guò)截圖簡(jiǎn)單的說(shuō)明下:
我開(kāi)啟三個(gè)會(huì)話(huà),則創(chuàng)建三個(gè)對(duì)應(yīng)的session文件,當(dāng)每個(gè)文件在30秒內(nèi)都沒(méi)被調(diào)用的話(huà),就會(huì)被當(dāng)成是“垃圾文件”,等到gc進(jìn)程調(diào)用的時(shí)候,“垃圾文件”就會(huì)被unlink,因?yàn)橹拔乙呀?jīng)通過(guò)修改php.ini配置文件,將gc被調(diào)用的概率改成百分百,所以接下來(lái),如果我重新使用任何一個(gè)瀏覽器刷新下頁(yè)面的時(shí)候,三個(gè)session文件,應(yīng)該只剩下一個(gè)了
如何永久化session? 如何銷(xiāo)毀session?其實(shí)讓Session結(jié)束生命周期,有以下兩種辦法:
* 一個(gè)是Session.invalidate()方法,不過(guò)這個(gè)方法在實(shí)際的開(kāi)發(fā)中,并不推薦,可能在強(qiáng)制注銷(xiāo)用戶(hù)的時(shí)候會(huì)使用; * 一個(gè)是當(dāng)前用戶(hù)和服務(wù)器的交互時(shí)間超過(guò)默認(rèn)時(shí)間后,Session會(huì)失效
我們知道Session是存在于服務(wù)器端的,當(dāng)把瀏覽器關(guān)閉時(shí),瀏覽器并沒(méi)有向服務(wù)器發(fā)送任何請(qǐng)求來(lái)關(guān)閉Session,自然Session也不會(huì)被銷(xiāo)毀,但是可以做一點(diǎn)努力,在所有的客戶(hù)端頁(yè)面里使用js的window.onclose來(lái)監(jiān)視瀏覽器的關(guān)閉動(dòng)作,然后向服務(wù)器發(fā)送一個(gè)請(qǐng)求來(lái)關(guān)閉Session,但是這種做法在實(shí)際的開(kāi)發(fā)中也是不推薦使用的,最正常的辦法就是不去管它,讓它等到默認(rèn)的時(shí)間后,自動(dòng)銷(xiāo)毀。
SESSION發(fā)出去的COOKIE一般屬于即時(shí)COOKIE,保存在內(nèi)存中,當(dāng)瀏覽器關(guān)閉后,才會(huì)過(guò)期,假如需要人為強(qiáng)制過(guò)期,比如 退出登錄,而不是關(guān)閉瀏覽器,那么就需要在代碼里銷(xiāo)毀SESSION,方法有很多,
setcookie(session_name(),session_id(),time() -8000000,..);//退出登錄前執(zhí)行
usset($_SESSION);//這會(huì)刪除所有的$_SESSION數(shù)據(jù),刷新后,有COOKIE傳過(guò)來(lái),但是沒(méi)有數(shù)據(jù)。
session_destroy();//這個(gè)作用更徹底,刪除$_SESSION 刪除session文件,和session_id
如何設(shè)置一個(gè)嚴(yán)格過(guò)期的sessioon?如何設(shè)置一個(gè)嚴(yán)格30分鐘過(guò)期的Session | 風(fēng)雪之隅
幾個(gè)問(wèn)題 禁用cookie,session還能使用嗎?詳細(xì)說(shuō)說(shuō)使用URL重寫(xiě),就是把session id直接附加在URL路徑的后面,作為URL路徑的附加信息。
( 當(dāng)客戶(hù)端的Cookie被禁用或出現(xiàn)問(wèn)題時(shí),PHP會(huì)自動(dòng)把Session ID附著在URL中,這樣再通過(guò)Session ID就能跨頁(yè)使用Session變量了。)
設(shè)置php.ini配置文件中的“session.use_trans_sid = 1”,或者編譯時(shí)打開(kāi)“--enable-trans-sid”選項(xiàng),讓PHP自動(dòng)跨頁(yè)傳遞Session ID。
手動(dòng)通過(guò)URL傳值、隱藏表單傳遞Session ID。
用文件、數(shù)據(jù)庫(kù)等形式保存Session ID,在跨頁(yè)過(guò)程中手動(dòng)調(diào)用。
通常情況下 Cookie 里記錄了 Session 的 id ,所有 Cookie 被禁用了也就意味著 Session 失效了。不過(guò) Session id 還有另外一種傳遞方式,就是在 URL 查詢(xún)中攜帶 Session id (既把所有的URL里都帶上Session id的參數(shù),如: http://xxx/index?sid=...)。不夠這種方法比較麻煩(所有的鏈接都要帶上),而且比較容易丟失 Session id(地址可以認(rèn)為修改去掉ID),所有只是作為備選方案,在 Cookie 不能使用的環(huán)境下可以作為替代。
常見(jiàn)的session實(shí)現(xiàn)方式是基于cookie的,所以禁用cookie,session隨之失效
理論上只要在返回的頁(yè)面里里能帶上一個(gè)標(biāo)識(shí)會(huì)話(huà)的令牌,在瀏覽器下一次提交的時(shí)候,能帶上這個(gè)令牌,會(huì)話(huà)就可以被保持
因此,cookie只是最優(yōu)雅的實(shí)現(xiàn)session的方式,因?yàn)閏ookie對(duì)用戶(hù)來(lái)說(shuō)不可見(jiàn),同時(shí)會(huì)自動(dòng)在HTTP報(bào)文中傳輸
但session也可以通過(guò)其他方式來(lái)保持, 比如放一個(gè)sessionId在URL的參數(shù)里
關(guān)閉瀏覽器不能結(jié)束一個(gè)會(huì)話(huà),.
session只是失效,但是并未被清除,關(guān)閉瀏覽器不等于退出登錄/結(jié)束會(huì)話(huà)了.....
那當(dāng)我們關(guān)閉瀏覽器之后,服務(wù)器端原來(lái)的session對(duì)象是否還存在呢?
答案是肯定的。服務(wù)端根本不知道我們是否關(guān)閉了瀏覽器,也不關(guān)心這個(gè)。客戶(hù)端與服務(wù)端之間進(jìn)行通信的唯一途徑就是通過(guò)請(qǐng)求。服務(wù)器有自己的一套機(jī)制來(lái)管理session,比如多長(zhǎng)時(shí)間會(huì)清除沒(méi)有使用過(guò)的session對(duì)象,等等。
那么為什么當(dāng)我們關(guān)閉瀏覽器后,就再也訪(fǎng)問(wèn)不到之前的session了呢?
所以說(shuō),關(guān)閉瀏覽器session就被清除只是我們所看到的表面現(xiàn)象(實(shí)際上是新建了一個(gè)session對(duì)象),通常情況下,服務(wù)器并不會(huì)馬上清除session對(duì)象,但這個(gè)根據(jù)服務(wù)端的設(shè)定而不同。
.0
其實(shí)之前的Session一直都在服務(wù)器.端,而當(dāng)我們關(guān)閉瀏覽器時(shí),此時(shí)的Cookie是存在于瀏覽器的進(jìn)程中的,當(dāng)瀏覽器關(guān)閉時(shí),Cookie也就不存在了。
其實(shí)Cookie有兩種:
* 一種是存在于瀏覽器的進(jìn)程中; * 一種是存在于硬盤(pán)上
而session的Cookie是存在于瀏覽器的進(jìn)程中,那么這種Cookie我們稱(chēng)為會(huì)話(huà)Cookie,
當(dāng)我們重新打開(kāi)瀏覽器窗口時(shí),之前的Cookie中存放的Sessionid已經(jīng)不存在了,此時(shí)
服務(wù)器從HttpServletRequest對(duì)象中沒(méi)有檢查到sessionid,服務(wù)器會(huì)再發(fā)送一個(gè)新的存
有Sessionid的Cookie到客戶(hù)端的瀏覽器中,此時(shí)對(duì)應(yīng)的是一個(gè)新的會(huì)話(huà),而服務(wù)器上
原先的session等到它的默認(rèn)時(shí)間到之后,便會(huì)自動(dòng)銷(xiāo)毀。
...so,以此類(lèi)推
當(dāng)在同一個(gè)瀏覽器中同時(shí)打開(kāi)多個(gè)標(biāo)簽,發(fā)送同一個(gè)請(qǐng)求或不同的請(qǐng)求,仍是同一個(gè)session;
當(dāng)不在同一個(gè)窗口中打開(kāi)相同的瀏覽器時(shí),發(fā)送請(qǐng)求,仍是同一個(gè)session;
當(dāng)使用不同的瀏覽器時(shí),發(fā)送請(qǐng)求,即使發(fā)送相同的請(qǐng)求,是不同的session;
當(dāng)把當(dāng)前某個(gè)瀏覽器的窗口全關(guān)閉,再打開(kāi),發(fā)起相同的請(qǐng)求時(shí),就是本文所闡述的,是不同的session,但是它和session的生命周期是沒(méi)有關(guān)系的.
PS:cookie一般分為兩種:一種是會(huì)話(huà)cookie,即服務(wù)端為session自動(dòng)創(chuàng)建的cookie,這個(gè)cookie存放在瀏覽器進(jìn)程中。另一種是可以存放在硬盤(pán)上的,可以通過(guò)服務(wù)端的某些設(shè)置,將一些信息放到cookie中并返回給客戶(hù)端存放在硬盤(pán)上。
Session是在客戶(hù)端請(qǐng)求到達(dá)服務(wù)器時(shí),服務(wù)器為此請(qǐng)求發(fā)出的客戶(hù)所創(chuàng)建的一個(gè)對(duì)象,保存在服務(wù)器端。購(gòu)物車(chē)是一個(gè)很好的例子,一個(gè)用戶(hù)可以有很多session,但每個(gè)session只針對(duì)一個(gè)用戶(hù),這就保證了不同session之間的信息獨(dú)立。
首先說(shuō)明一點(diǎn),在通常意義上,session所能發(fā)揮作用是基于cookie機(jī)制。針對(duì)所需要解釋的問(wèn)題,做這樣一個(gè)假設(shè):我們第一次訪(fǎng)問(wèn)一個(gè)網(wǎng)頁(yè)。當(dāng)客戶(hù)端發(fā)送請(qǐng)求后,服務(wù)端會(huì)建立一個(gè)針對(duì)此請(qǐng)求發(fā)出客戶(hù)的session對(duì)象,而且每個(gè)session都會(huì)有一個(gè)sessionID。服務(wù)端會(huì)自動(dòng)將這個(gè)sessionID作為一個(gè)cookie附加到response上返回給客戶(hù)端,這個(gè)cookie存放在瀏覽器內(nèi)存中。我們每次對(duì)此網(wǎng)頁(yè)發(fā)送的request都會(huì)附帶著這個(gè)cookie,服務(wù)端收到這個(gè)請(qǐng)求后會(huì)都去cookie中取得這個(gè)sessionID,然后查詢(xún)服務(wù)端是否存在一個(gè)對(duì)應(yīng)此ID的session對(duì)象。如果有,可以直接使用此session;如果沒(méi)有,則會(huì)新建一個(gè)。當(dāng)瀏覽器關(guān)閉后,其所占的內(nèi)存就會(huì)是放掉,cookie自然也就被清除了,此時(shí)我們不再保存有這個(gè)sessionID。所以再打開(kāi)瀏覽器訪(fǎng)問(wèn)同一個(gè)頁(yè)面時(shí),由于沒(méi)有sessionID,也就查不到對(duì)應(yīng)的session對(duì)象,此時(shí)重新創(chuàng)建一個(gè)新的session對(duì)象。session和cookie的區(qū)別?
存儲(chǔ)位置,隱私策略和安全性,數(shù)據(jù)類(lèi)型,有效期,服務(wù)器壓力,瀏覽器支持,跨域支持,數(shù)據(jù)量
cookie在客戶(hù)端,session在服務(wù)器端
cookie在本地,可以隨便修改,session更安全
cookie只支持ascII字符串,需要解碼。session支持所有的數(shù)據(jù)類(lèi)型。
cookie存在本地,可以永久有效。而session在服務(wù)器上,設(shè)置永久有效之后,服務(wù)器上session會(huì)不斷累積,會(huì)導(dǎo)致內(nèi)存溢出。
session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪(fǎng)問(wèn)增多,會(huì)比較占用你服務(wù)器的性能,如果主要考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用cookie。
cookie需要瀏覽器支持,session不支持。
cookie支持跨域,session不支持跨域。
存儲(chǔ)量不同。
1 .數(shù)據(jù)類(lèi)型的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二進(jìn)制數(shù)據(jù),需求先進(jìn)行編碼。Cookie中也不能直接存取Java對(duì)象。若要存儲(chǔ)略微復(fù)雜的信息,運(yùn)用Cookie是比擬艱難的。
而Session中能夠存取任何類(lèi)型的數(shù)據(jù),包括而不限于String、Integer、List、Map等。Session中也能夠直接保管Java Bean乃至任何Java類(lèi),對(duì)象等,運(yùn)用起來(lái)十分便當(dāng)。能夠把Session看做是一個(gè)Java容器類(lèi)。
2 .隱私策略的不同
Cookie存儲(chǔ)在客戶(hù)端閱讀器中,對(duì)客戶(hù)端是可見(jiàn)的,客戶(hù)端的一些程序可能會(huì)窺探、復(fù)制以至修正Cookie中的內(nèi)容。而Session存儲(chǔ)在服務(wù)器上,對(duì)客戶(hù)端是透明的,不存在敏感信息泄露的風(fēng)險(xiǎn)。
假如選用Cookie,比較好的方法是,敏感的信息如賬號(hào)密碼等盡量不要寫(xiě)到Cookie中。最好是像Google、Baidu那樣將Cookie信息加密,提交到服務(wù)器后再進(jìn)行解密,保證Cookie中的信息只要本人能讀得懂。而假如選擇Session就省事多了,反正是放在服務(wù)器上,Session里任何隱私都能夠有效的保護(hù)。
3.有效期上的不同
使用過(guò)Google的人都曉得,假如登錄過(guò)Google,則Google的登錄信息長(zhǎng)期有效。用戶(hù)不用每次訪(fǎng)問(wèn)都重新登錄,Google會(huì)持久地記載該用戶(hù)的登錄信息。要到達(dá)這種效果,運(yùn)用Cookie會(huì)是比較好的選擇。只需要設(shè)置Cookie的過(guò)期時(shí)間屬性為一個(gè)很大很大的數(shù)字。
由于Session依賴(lài)于名為JSESSIONID的Cookie,而Cookie JSESSIONID的過(guò)期時(shí)間默許為–1,只需關(guān)閉了閱讀器該Session就會(huì)失效,因而Session不能完成信息永世有效的效果。運(yùn)用URL地址重寫(xiě)也不能完成。而且假如設(shè)置Session的超時(shí)時(shí)間過(guò)長(zhǎng),服務(wù)器累計(jì)的Session就會(huì)越多,越容易招致內(nèi)存溢出。
4.服務(wù)器壓力的不同
Session是保管在服務(wù)器端的,每個(gè)用戶(hù)都會(huì)產(chǎn)生一個(gè)Session。假如并發(fā)訪(fǎng)問(wèn)的用戶(hù)十分多,會(huì)產(chǎn)生十分多的Session,耗費(fèi)大量的內(nèi)存。因而像Google、Baidu、Sina這樣并發(fā)訪(fǎng)問(wèn)量極高的網(wǎng)站,是不太可能運(yùn)用Session來(lái)追蹤客戶(hù)會(huì)話(huà)的。
而Cookie保管在客戶(hù)端,不占用服務(wù)器資源。假如并發(fā)閱讀的用戶(hù)十分多,Cookie是很好的選擇。關(guān)于Google、Baidu、Sina來(lái)說(shuō),Cookie或許是唯一的選擇。
5.瀏覽器支持的不同
Cookie是需要客戶(hù)端瀏覽器支持的。假如客戶(hù)端禁用了Cookie,或者不支持Cookie,則會(huì)話(huà)跟蹤會(huì)失效。關(guān)于WAP上的應(yīng)用,常規(guī)的Cookie就派不上用場(chǎng)了。
假如客戶(hù)端瀏覽器不支持Cookie,需要運(yùn)用Session以及URL地址重寫(xiě)。需要注意的是一切的用到Session程序的URL都要進(jìn)行URL地址重寫(xiě),否則Session會(huì)話(huà)跟蹤還會(huì)失效。關(guān)于WAP應(yīng)用來(lái)說(shuō),Session+URL地址重寫(xiě)或許是它唯一的選擇。
假如客戶(hù)端支持Cookie,則Cookie既能夠設(shè)為本瀏覽器窗口以及子窗口內(nèi)有效(把過(guò)期時(shí)間設(shè)為–1),也能夠設(shè)為一切閱讀器窗口內(nèi)有效(把過(guò)期時(shí)間設(shè)為某個(gè)大于0的整數(shù))。但Session只能在本閱讀器窗口以及其子窗口內(nèi)有效。假如兩個(gè)瀏覽器窗口互不相干,它們將運(yùn)用兩個(gè)不同的Session。(IE8下不同窗口Session相干)
6.跨域支持上的不同
Cookie支持跨域名訪(fǎng)問(wèn),例如將domain屬性設(shè)置為“.biaodianfu.com”,則以“.biaodianfu.com”為后綴的一切域名均能夠訪(fǎng)問(wèn)該Cookie。跨域名Cookie如今被普遍用在網(wǎng)絡(luò)中,例如Google、Baidu、Sina等。而Session則不會(huì)支持跨域名訪(fǎng)問(wèn)。Session僅在他所在的域名內(nèi)有效。
僅運(yùn)用Cookie或者僅運(yùn)用Session可能完成不了理想的效果。這時(shí)應(yīng)該嘗試一下同時(shí)運(yùn)用Cookie與Session。Cookie與Session的搭配運(yùn)用在實(shí)踐項(xiàng)目中會(huì)完成很多意想不到的效果。
7.存儲(chǔ)數(shù)據(jù)量不同
單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4k,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie
8.session和cookie的使用場(chǎng)景?
將登陸信息等重要信息存放為SESSION;其他信息如果需要保留,可以放在COOKIE中。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/25870.html
摘要:服務(wù)器檢查該,以此來(lái)辨認(rèn)用戶(hù)狀態(tài)。五下的相關(guān)應(yīng)用應(yīng)用在中配置如下配置項(xiàng)用于設(shè)置存儲(chǔ)方式,默認(rèn)是,即存儲(chǔ)在文件中,該文件位于配置項(xiàng)配置的路徑,即。配置項(xiàng)用于設(shè)置有效期,默認(rèn)為分鐘。配置項(xiàng)用于配置數(shù)據(jù)是否加密。 一、cookie的由來(lái) ??當(dāng)用戶(hù)訪(fǎng)問(wèn)某網(wǎng)站時(shí),web服務(wù)器會(huì)將部分信息保存到本地計(jì)算機(jī)上,當(dāng)用戶(hù)再次關(guān)顧該網(wǎng)站時(shí),服務(wù)器會(huì)去查看用戶(hù)是否登錄過(guò)該網(wǎng)站,如果登錄過(guò),就會(huì)將這些記錄在...
摘要:前言最近看了一些同學(xué)的面經(jīng),發(fā)現(xiàn)無(wú)論什么技術(shù)崗位,還是會(huì)問(wèn)到和的區(qū)別。所有學(xué)技術(shù)的同學(xué)都知道和函數(shù)怎么用,知道和的區(qū)別就是是儲(chǔ)存在服務(wù)端的,是存儲(chǔ)在瀏覽器的。的誕生是為了能讓無(wú)狀態(tài)的報(bào)文帶上一些特殊的數(shù)據(jù),讓服務(wù)端能夠辨識(shí)請(qǐng)求的身份。 1 前言 最近看了一些同學(xué)的面經(jīng),發(fā)現(xiàn)無(wú)論什么技術(shù)崗位,還是會(huì)問(wèn)到 Session 和 Cookie 的區(qū)別。 所有學(xué)技術(shù)的同學(xué)都知道 Session ...
摘要:無(wú)狀態(tài)協(xié)議無(wú)狀態(tài)協(xié)議,是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。是通過(guò)客戶(hù)端保持狀態(tài)的解決方案。而這次,信息則存放在請(qǐng)求頭了。 HTTP無(wú)狀態(tài)協(xié)議 HTTP無(wú)狀態(tài)協(xié)議,是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方...
閱讀 1587·2021-10-18 13:35
閱讀 2365·2021-10-09 09:44
閱讀 819·2021-10-08 10:05
閱讀 2719·2021-09-26 09:47
閱讀 3571·2021-09-22 15:22
閱讀 435·2019-08-29 12:24
閱讀 2002·2019-08-29 11:06
閱讀 2860·2019-08-26 12:23