`
crazier9527
  • 浏览: 995737 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SNA方案之session炒冷饭

阅读更多

SNA方案中,session的处理是一个重要方面。

原帖见这里:http://www.iteye.com/topic/200611

原帖里提到的两种方案都需要hack代码。

下面是我的方案:

1、使用会话cookie保存web服务器产生的sessionid
   为什么是sessionid而不是userid,原因在于谁也不知道除去登录外其他人会在httpsession里干些什么

2、自定义SessionMap<String,Serializable>同步保存httpsession内的信息
   自定义SessionMap同步httpsession,在操作httpsession时不用改变调用接口,不用东张西望

3、使用分布式缓存memcached保存自定义SessionMap<String,Serializable>

4、会话胶粘
   未失败转发的情况下没必要在memcached和httpsession之间复制来复制去,眉来眼去

5、使用SnaFilter处理失败转发

6、使用HttpSessionListener实现SessionMap<String,Serializable>的过期
   利用容器session 机制的好处,httpsession过期的时候干掉memecached里的SessionMap

 

下面根据web请求的过程分情况讨论该方案:

A、登录


<!---->

根据请求的url判断是否是登录请求

在线人数保存在memcached

B、 正常请求


<!---->

C、 失败转发


<!---->

D、登出


<!---->

根据请求的url判断是否是登出请求

E、HttpSession过期

hack memcached,使用HttpSessionListenersessionDestroyed事件时根据sessionid删除memcached里的sessionMap(如果存在)

 

关于在线人数的统计:在线人数存储在memcached里,将在线人数与sessionMap绑定,往memcached里增加sessionMap时在线人数+1,删除时-1.

分享到:
评论
1 楼 yongtree 2011-05-09  
你好,我简单测试了一下,如果cookie中保存了sessionid,然后在一个服务器当掉,http请求到一个新的服务器上时,他的sessionid依然是cookie中的sessionid。是不是采用cookiesessionid和sessionid对比一致来判断是无效的判断。

我认为每次都应该去cache里取一下session,而无需判断,判断的话只判断session里是否存在数据,如果没有则将cache复制给他。如果不每次去cache中取,就会造成session没有过期,而cache过期了,如果这时出了故障,再去cache中取,也是没有数据的,根本做不了故障转移。

相关推荐

Global site tag (gtag.js) - Google Analytics