session的總結(jié)
session的工作原理
客戶端提交表單,其中包含從cookie得到的sessionid,服務(wù)器根據(jù)這個(gè)sessionid,查找:
1、存在這個(gè)session對(duì)象,則判斷是不是已經(jīng)過(guò)期這個(gè)session對(duì)象,沒(méi)有返回,否則,返回一個(gè)新的session對(duì)象
2、沒(méi)有這個(gè)session對(duì)象,返回一個(gè)新的session對(duì)象
影響session生命周期的因素:
1、session的MaxInactiveInterval
2、session的invalidate
3、服務(wù)器是否啟動(dòng)。
【注意】與瀏覽器是否關(guān)閉沒(méi)有關(guān)系
session的removeAttribute(String attrib)
------------------------------------------------------
當(dāng)你第一次訪問(wèn)一個(gè)網(wǎng)站的時(shí)候,網(wǎng)站服務(wù)器會(huì)在響應(yīng)頭內(nèi)加上Set-
Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服務(wù)器),或Set-Cookie
JSESSIONID=nj1tvkclp3jh83olcn3191sjq3(java服務(wù)器)信息,此信息是服務(wù)器隨機(jī)生成的,放在服務(wù)器內(nèi)存里,為
了標(biāo)識(shí)唯一的客戶端用戶,內(nèi)容不會(huì)重復(fù),這就是sessionid.
當(dāng)瀏覽器得到這個(gè)sessionid會(huì)將它放在自己的進(jìn)程內(nèi)存里,這里不同的瀏覽器會(huì)有所不同,IE進(jìn)程間不能共享這個(gè)sessionid,也就是新開(kāi)一
個(gè)IE將不能共享這個(gè)sessionid;而Firefox進(jìn)程間可以共享.然后你繼續(xù)發(fā)請(qǐng)求給這個(gè)網(wǎng)站的時(shí)候,瀏覽器就會(huì)把這個(gè)sessionid放在
請(qǐng)求頭里發(fā)送給該服務(wù)器了,這樣服務(wù)器得到sessionid后再和自己內(nèi)存里存放的sessionid對(duì)比鎖定客戶端,從而區(qū)分不同客戶端,完成會(huì)話.
可以看出如果用這種方式,當(dāng)用戶在會(huì)話的過(guò)程中關(guān)閉瀏覽器結(jié)束進(jìn)程,則這個(gè)sessionid將消失,如果用戶又打開(kāi)瀏覽器想繼續(xù)這次會(huì)話的時(shí)候,就會(huì)因
為發(fā)送的請(qǐng)求中沒(méi)有這個(gè)sessionid而使服務(wù)器無(wú)法辨別該把那個(gè)session信息給他,注意(這個(gè)時(shí)候服務(wù)器端的sessionid和
sessionid所指向的session都還存在,只是沒(méi)有正確的sessionid和它匹配而占用服務(wù)器內(nèi)存,只有session過(guò)期或服務(wù)器重啟才
釋放內(nèi)存).
上面這種方式叫會(huì)話cookie,把cookie放在瀏覽器內(nèi)存里,只能在這個(gè)瀏覽器的內(nèi)存范圍里完成會(huì)話,是一種不長(zhǎng)久的方式,為了能長(zhǎng)久會(huì)話,就出現(xiàn)
了持久化cookie,把cookie固化在用戶的計(jì)算機(jī)上,現(xiàn)在的cookie不單單能存放sessionid,還能放用戶信息,樣式表信息等.
如果用戶禁止了所有cookie的使用,那么會(huì)話cookie和持久化cookie都不能用了,有個(gè)方案也可以解決問(wèn)題,就是URL重寫,這里要說(shuō)下的就
是URL重寫只能實(shí)現(xiàn)會(huì)話cookie的效果,持久會(huì)話實(shí)現(xiàn)不了.
補(bǔ)充一點(diǎn)內(nèi)容:客戶端COOKIE又分為進(jìn)程COOKIE和持久COOKIE,簡(jiǎn)單點(diǎn)說(shuō)就是COOKIE要么保存在瀏覽器進(jìn)程中,隨瀏覽器關(guān)閉而消失,要 么保存在客戶端本地文件中。具體采用哪種保存方式,由服務(wù)端決定。一般在SERVLET中使用javax.servlet.http.Cookie的 setMaxAge()來(lái)決定是進(jìn)程COOKIE還是持久COOKIE。在TOMCAT中,TOMCAT創(chuàng)建了jsessionid這個(gè)COOKIE,并 且設(shè)置setMaxAge(-1),也就是說(shuō)TOMCAT下jsessionid的COOKEI是進(jìn)程COOKIE,在客戶端本地是看不到這個(gè) COOKIE文件的。