改进基于filter的远程分布式session存储
<!--StartFragment-->
?
参考了网上一些资料,实现了session通过filter存储到memcached服务器上.
(参见: http://ooft.iteye.com/blog/537841 )
实现方式:
a)????通过MemcachedSessionFilter过滤器拦截cookie,取得的sessionId,通过sessionId构造新的HttpServletRequestWrapper对象,传给后面的应用.
b)????继承重构HttpServletRequestWrapper,HttpSessionWrapper类,覆盖原来和session存取相关的方法呢,都通过SessionService类来实现.
c)????SessionService连接memcached服务,以sessionId作为key,存取的对象是一个map.map的内容即为session的内容.
d)????读取数据时,先通过sessionId从memcached服务器上获取整个map对象,再以session的attributeName作为key从map中获取数据对象.写数据的方式与读数据类似,先获取map,然后修改map中的值,然后将整个map保存到memcached服务器上.
改进内容:
?
1 楼 colorless 2009-12-21 很好的思路。可以有效避免tomcat集群的时候需要做session复杂产生的效率低下的问题,特别是点很多的时候。 2 楼 colorless 2009-12-21 不知道实际环境有没有比较好的应用? 3 楼 colorless 2009-12-21 每次一个map放memcache上,是不是数据量太大了? 4 楼 colorless 2009-12-21 引用public static synchronized XSessionService getInstance() {
if (instance == null) {
instance = new XSessionService();
}
return instance;
}
看了楼主的代码,其中这段做同步好像也不好,会有严重并发问题吧? 5 楼 colorless 2009-12-21 还有cookie中保存的sid是不是永远不过期的,这样会不会造成这个用户每次上来都是同一个sid,不管是今天还是明天访问。这个也是一个很大的安全隐患吧? 6 楼 neptune 2009-12-22 java中很多人都想过用memcached存储session,可session过期你如何解决呢? 7 楼 hxpterry 2009-12-22 虽然memcache也有过期时间,但假如web服务器重启了,memcache中的数据还在,的确是个问题,曾经我们的项目中也曾考虑过用memcache做集群中的session,但最后还是取消了。 8 楼 langshao 2009-12-22 在HttpSession的实现中,换成RMI远程调用Session服务器上相应的方法,会不会可以避免对Session的操作传输可能很大的Map呢?
如果请求到达之后可以忽略此后其他请求对Session的更新,那么可以再在本地缓存此Session,当然这样的话对Session的更新就要同时对本地缓存Session以及Session服务器上的进行更新。这里要权衡Session的大小以及对Session的访问程度等。
对于Session服务器上的并发问题,只要在更新时锁住要更新的Session就可以了,没必要锁整个方法。
并且session服务器上的程序可以维护一个session的最后访问时间,超时了就将其清出。
PS:用不用memcache就不说了,没研究过。 9 楼 neptune 2009-12-22 每次web访问都要记录访问时间,服务器必死! 10 楼 langshao 2009-12-22 其实这个Date就可以记录在Session的某个key中,服务器会挂??
11 楼 neptune 2009-12-23 langshao 写道其实这个Date就可以记录在Session的某个key中,服务器会挂??
请问你的这个Date(访问时间)记录在那呀,是在Memcached吗?有空看看Tomcat的SessionImpl吧,因为要实现Session超时功能,你要每次访问服务器都记录本次访问时间,相当于每次访问服务器必访问一次Memcached,而不是每次访问Session那么简单。