關於java的session共享

 關於java的session共享java

目前大多數大型網站的服務器都採用了分佈式的部署方式,可是session是在服務器端保存的,若是用戶跳轉到其餘服務器的話,session就會丟失,因而就有了分佈式系統的session共享問題。算法

 

session共享有不少解決方法,比較經常使用的以下:tomcat

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

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

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

 

本文主要介紹經過memcached共享的方式.分佈式

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

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

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

相關文章
相關標籤/搜索