<a href="http://www.cnblogs.com/binger/archive/2013/03/19/2970171.html" target="_blank">Session的生命周期</a>
Session存儲在伺服器端,一般為了防止在伺服器的記憶體中(為了高速存取),Sessinon在使用者通路第一次通路伺服器時創
建,需要注意隻有通路JSP、Servlet等程式時才會建立Session,隻通路HTML、IMAGE等靜态資源并不會建立Session,可調用
request.getSession(true)強制生成Session。
Session什麼時候失效?
1. 伺服器會把長時間沒有活動的Session從伺服器記憶體中清除,此時Session便失效。Tomcat中Session的預設失效時間為20分鐘。
2. 調用Session的invalidate方法。
3.伺服器程序被停止。
在程式開發的時候, request session appplication内置對象, 是用的比較多的. request和appliction比較簡單, 一個代表一次請求的生命周期. 另一個代表應用程式的生命周期. 多說一點application是單态模式. 在任何地方列印application内置對象,得到的是同一個位址. 是以可以存儲程式的公共變量,而非個人的公共變量(個人的公共變量 例如登入資訊) 應該存儲到Session中
存儲到session中的 User對象一定要實作Serializable接口.
request的生命周期是request請求域,一個請求結束,則request結束
session的生命周期是session會話域,打開一個浏覽器請求一個網站的頁面後,Session開始,當session超過時間限制(一般是20分種)後,session登出而失效
或是人為使用session.invalidate();使用session失效;
或是關閉浏覽器後,session還存在,但是這裡已經無法擷取session了,過一會它還是失效
Session儲存在伺服器端。為了獲得更高的存取速度,伺服器一般把Session放在記憶體裡。每個使用者都會有一個獨立的Session。如果Session内容過于複雜,當大量客戶通路伺服器時可能會導緻記憶體溢出。是以,Session裡的資訊應該盡量精簡。
Session在使用者第一次通路伺服器的時候自動建立。需要注意隻有通路JSP、Servlet等程式時才會建立Session,隻通路HTML、IMAGE等靜态資源并不會建立Session。如果尚未生成Session,也可以使用request.getSession(true)強制生成Session。
Session生成後,隻要使用者繼續通路,伺服器就會更新Session的最後通路時間,并維護該Session。使用者每通路伺服器一次,無論是否讀寫Session,伺服器都認為該使用者的Session"活躍(active)"了一次。
由于會有越來越多的使用者通路伺服器,是以Session也會越來越多。為防止記憶體溢出,伺服器會把長時間内沒有活躍的Session從記憶體删除。這個時間就是Session的逾時時間。如果超過了逾時時間沒通路過伺服器,Session就自動失效了。
Session的逾時時間為maxInactiveInterval屬性,可以通過對應的getMaxInactiveInterval()擷取,通過setMaxInactiveInterval(long interval)修改。
Session的逾時時間也可以在web.xml中修改。另外,通過調用Session的invalidate()方法可以使Session失效。
雖然Session儲存在伺服器,對用戶端是透明的,它的正常運作仍然需要用戶端浏覽器的支援。這是因為Session需要使用Cookie作為識别标志。HTTP協定是無狀态的,Session不能依據HTTP連接配接來判斷是否為同一客戶,是以伺服器向用戶端浏覽器發送一個名為JSESSIONID的Cookie,它的值為該Session的id(也就是HttpSession.getId()的傳回值)。Session依據該Cookie來識别是否為同一使用者。
該Cookie為伺服器自動生成的,它的maxAge屬性一般為-1,表示僅目前浏覽器内有效,并且各浏覽器視窗間不共享,關閉浏覽器就會失效。是以同一機器的兩個浏覽器視窗通路伺服器時,會生成兩個不同的Session。但是由浏覽器視窗内的連結、腳本等打開的新視窗(也就是說不是輕按兩下桌面浏覽器圖示等打開的視窗)除外。這類子視窗會共享父視窗的Cookie,是以會共享一個Session。
注意:新開的浏覽器視窗會生成新的Session,但子視窗除外。子視窗會共用父視窗的Session。例如,在連結上右擊,在彈出的快捷菜單中選擇"在新視窗中打開"時,子視窗便可以通路父視窗的Session。
=====================================================================================
Session與Cookie的比較
Cookie與Session都可以進行會話跟蹤,但是實作的原理不太一樣。一般情況下二者均可以滿足需求,但有時候不可以使用Cookie,有時候不可以使用Session。下面通過比較說明二者的特點以及适用的場合。
5.3.1 從存取方式上比較
Cookie中隻能儲存ASCII字元串,如果需要存取Unicode字元或者二進制資料,需要進行UTF-8,GBK或者BASE64等方式的編碼。Cookie中也不能直接存取Java對象。若要存儲稍微複雜的資訊,使用Cookie是比較困難的。
而Session中可以存取任何類型的資料,包括而不限于String、Integer、List、Map等。Session中也可以直接儲存Java Bean乃至任何Java類,對象等,使用起來非常友善。可以把Session看做是一個Java容器類。
從隐私安全上比較
Cookie存儲在用戶端浏覽器中,對用戶端是可見的,用戶端的一些程式可能會窺探、複制甚至修改Cookie中的内容。而Session存儲在伺服器上,對用戶端是透明的,不存在敏感資訊洩露的危險。
如果選用Cookie,比較好的辦法是,敏感的資訊如賬号密碼等盡量不要寫到Cookie中。最好是像Google、Baidu那樣将Cookie資訊加密,送出到伺服器後再進行解密,保證Cookie中的資訊隻有自己能讀得懂。而如果選擇Session就省事多了,反正是放在伺服器上,Session裡任何隐私都可以。
從有效期上比較
使用過Google的人都知道,如果登入過Google,則Google的登入消息長期有效。使用者不必每次通路都重新登入,Google會長久地記錄該使用者的登入資訊。要達到這種效果,使用Cookie會是比較好的選擇。隻需要設定Cookie的maxAge屬性為一個很大很大的數字或者Integer.MAX_VALUE就可以了。Cookie的maxAge屬性支援這樣的效果。
使用Session理論上也能實作這種效果。隻要調用方法setMaxInactiveInterval(Integer. MAX_VALUE)不就可以了麼。但是由于Session依賴于名為JSESSIONID的Cookie,而Cookie JSESSIONID的maxAge預設為-1,隻要關閉了浏覽器該Session就會失效,是以Session不能實作資訊永久有效的效果。使用URL位址重寫也不能實作。
而且如果設定Session的逾時時間過長,伺服器累計的Session就會越多,越容易導緻記憶體溢出。
從對伺服器的負擔上比較
Session是儲存在伺服器端的,每個使用者都會産生一個Session。如果并發通路的使用者非常多,會産生非常多的Session,消耗大量的記憶體。是以像Google、Baidu、Sina這樣并發通路量極高的網站,是不太可能使用Session來追蹤客戶會話的。
而Cookie儲存在用戶端,不占用伺服器資源。如果并發浏覽的使用者非常多,Cookie是很好的選擇。對于Google、Baidu、Sina來說,Cookie也許是唯一的選擇。
從浏覽器支援上比較
Cookie是需要用戶端浏覽器支援的。如果用戶端禁用了Cookie,或者不支援Cookie,則會話跟蹤會失效。對于WAP上的應用,正常的Cookie就派不上用場了。
如果用戶端浏覽器不支援Cookie,需要使用Session以及URL位址重寫。需要注意的是所有的用到Session程式的URL都要使用response.encodeURL(String URL)或者response.encodeRedirectURL(String URL)進行URL位址重寫,否則導緻Session會話跟蹤失敗。對于WAP應用來說,Session+URL位址重寫也許是它唯一的選擇。
如果用戶端支援Cookie,則Cookie既可以設為本浏覽器視窗以及子視窗内有效(把maxAge設為-1),也可以設為所有浏覽器視窗内有效(把maxAge設為某個大于0的整數)。但Session隻能在本浏覽器視窗以及其子視窗内有效。如果兩個浏覽器視窗互不相幹,它們将使用兩個不同的Session。
從跨域名上比較
Cookie支援跨域名通路,例如将domain屬性設定為".helloweenvsfei.com",則以".helloweenvsfei.com"為字尾的所有域名均可以通路該Cookie。跨域名Cookie現在被廣泛用在網絡中,例如Google、Baidu、Sina等。而Session則不會支援跨域名通路。Session僅在他所在的域名内有效。
注意:僅使用Cookie或者僅使用Session可能實作不了理想的效果。這時應該嘗試一下同時使用Cookie與Session。Cookie與Session的搭配使用在實際項目中會實作絢爛多姿的效果。
============== 2017-08-10 han add =====================
<a href="http://blog.csdn.net/gaolinwu/article/details/7285783" target="_blank">http://blog.csdn.net/gaolinwu/article/details/7285783</a>
本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/1532425,如需轉載請自行聯系原作者