關於java的session共享

 關於java的session共享

目前大多數大型網站的服務器都採用了分佈式的部署方式,但是session是在服務器端保存的,如果用戶跳轉到其他服務器的話,session就會丟失,於是就有了分佈式系統的session共享問題。

 

session共享有很多解決方法,比較常用的如下:

一、以cookie加密的方式保存在客戶端.優點是減輕服務器端的壓力,缺點是受到cookie的大小限制,可能佔用一定帶寬,因爲每次請求會在頭部附帶一定大小的cookie信息,另外這種方式在用戶禁止使用cookie的情況下無效.

二、服務器間同步。定時同步各個服務器的session信息,此方法可能有一定延時,用戶體驗也不是很好。

三、以某種媒介共享session信息,比如memcached,NFS等

 

本文主要介紹通過memcached共享的方式.

以memcached共享的方式實現的目前比較流行的有兩種,一種是修改servlet容器,修改容器代碼中的session相關代碼,使其連接memcached,在memcached中創建和更新session.目前實現的有tomcat的插件,詳見:http://code.google.com/p/memcached-session-manager/,優點是你不用考慮session共享的問題了,可以專注於你的程序開發,向正常使用session那樣使用就完事了,缺點是如果你想改變session策略的話,必須重新部署每個服務器的servlet容器.而且修改容器代碼存在一定的穩定性風險.如果不小心改壞了,就不爽了,另外如果servlet容器升級,必須做相應修改,也比較麻煩.

另外一種是使用過濾器的方式,可參照網上例子:http://laoer.iteye.com/blog/82565 的例子,此方式使用過濾器的方式重新對httpRequest 對象進行了包裝,並加入memcached客戶端,此方式的優點是:使用簡單,把過濾器配置進去即可,另外比較靈活,因爲它是再客戶端實現的,配置比較靈活,而且服務器無關,你可以在任何支持servlet的容器上部署。缺點:當然他的缺點也是第一種方式的缺點,受制於memcached,比如:如果出現內存緊張的情況,根據memcached的LRU算法,有可能將用戶的一部分session覆蓋,從而導致部分session丟失.

筆者根據http://laoer.iteye.com/blog/82565的代碼,重新寫了一個過濾器,並添加session過期的功能,目前已在struts2中成功應用.詳見附件.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章