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