session機制及session的應用

session簡介

Session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。使用上比Cookie簡單一些,相應的也增加了服務器的存儲壓力。

客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼Session機制就是通過檢查服務器上的“客戶明細表”來確認客戶身份。Session保存在服務器端。爲了獲得更高的存取速度,服務器一般把Session放在內裏。每個用戶都會有一個獨立的Session。如果Session內容過於複雜,當大量客戶訪問服務器時可能會導致內存溢出。因此,Session裏的信息應該儘量精簡。需要注意只有第一次訪問JSP、Servlet等程序時纔會創建Session,訪問HTML、IMAGE等靜態資源並不會創建Session。Session生成後,只要用戶繼續訪問,無論是否讀寫Session,服務器都認爲該用戶的Session“活躍(active)”了一次。服務器就會更新Session的最後訪問時間,並維護該Session。爲防止內存溢出,服務器會把長時間內沒有活躍的Session從內存刪除。這個時間就是Session的超時時間。如果超過了超時時間沒訪問過服務器,Session就自動失效了,默認的過期時間是30分鐘。

cookie與session的關係

關係

服務端的session的實現對客戶端的cookie有依賴關係的,上面我講到服務端執行session機制時候會生成session的id值,這個id值會發送給客戶端,客戶端每次請求都會把這個id值放到http請求的頭部發送給服務端,而這個id值在客戶端會保存下來,保存的容器就是cookie,因此當我們完全禁掉瀏覽器的cookie的時候,服務端的session也會不能正常使用。
如果客戶端瀏覽器將Cookie功能禁用,或者不支持Cookie怎麼辦?Java Web提供了另一種解決方案:URL地址重寫

比較

cookie存儲在客戶端,session存儲在服務器端。也因此:cookie相對來說不如session安全

cookie存儲大小和數量有限制,session理論上是無限制的。

cookie的銷燬:默認爲關閉瀏覽器,設置過期時間後則過期後就會銷燬,

session的銷燬:某個請求週期內調用了Session.invalidate()方法,session被銷燬;或者是session超時後自動銷燬;或者客戶端關掉瀏覽器。

java操作session

HttpSession session = request.getSession(); 
session.setAttribute("key", value); 
session.getAttribute("key"); 
session.removeAttribute("key"); 
session.setMaxInactiveInterval(60);//單位爲秒
session.invalidate(); //刪除所有session中保存的鍵

集羣環境中session共享問題

1) session的存儲應該獨立於web容器,也要獨立於部署web容器的服務器;
2)如何進行高效的session同步。
在講到解決這些問題之前,我們首先要考慮下session如何存儲纔是高效,是存在內存、文件還是數據庫了?文件和數據庫的存儲方式都是將session的數據固化到硬盤上,操作硬盤的方式就是IO,IO操作的效率是遠遠低於操作內存的數據,因此文件和數據庫存儲方式是不可取的,所以將session數據存儲到內存是最佳的選擇。因此最好的解決方案就是使用分佈式緩存技術,例如:memcached和redis,將session信息的存儲獨立出來也是解決session同步問題的方法。
Tomcat的session同步也有使用memcache的解決方案,大家可以參加下面的文章:
tomcat集羣session同步之memcache方案
但是該方案只是解決了同步問題,session機制任然和web容器緊耦合,我們需要一個高效、可擴展的解決方案,那麼我們就應該不是簡單的把session獨立出來存儲而是設計一個完全獨立的session機制,它既能給每個web應用提供session的功能又可以實現session同步,下面是一篇用zookeeper實現的分佈式session方案:
基於ZooKeeper的分佈式Session實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章