论坛首页 Java企业应用论坛

SNA方案之session炒冷饭

浏览 3298 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-09-04  


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.

   发表时间:2008-09-04  
其实你还只是把web容器的session自己封装后再保存到memcached里的,但是你还是不能实现多个tomcat容器共享session和session失效问题,假设我在tomcat-8001里呆了25分钟,然后再跑到tomcat-8002呆了20分钟,这个时候再返回到tomcat-8001的时候,在tomcat-8001里已经超时了,而按照整套系统来说的话是不应该出现超时,也就是说tomcat-8001的session还是应该存在的,这种情况你的方案还是不能实现。
0 请登录后投票
   发表时间:2008-09-04  
Arden 写道
其实你还只是把web容器的session自己封装后再保存到memcached里的,但是你还是不能实现多个tomcat容器共享session和session失效问题,假设我在tomcat-8001里呆了25分钟,然后再跑到tomcat-8002呆了20分钟,这个时候再返回到tomcat-8001的时候,在tomcat-8001里已经超时了,而按照整套系统来说的话是不应该出现超时,也就是说tomcat-8001的session还是应该存在的,这种情况你的方案还是不能实现。

不太明白你的意思,首先我采用了粘性会话,所以正常情况下不会出现在tomcat-8001里呆了25分钟,然后再跑到tomcat-8002呆了20分钟。另外tomcat-8001的session即使不存在了也没有关系,filter会新建一个session,然后将memcached里保存的session信息设置到session里。
0 请登录后投票
   发表时间:2008-09-04  
你的意思是给memcached的session设置一个如snaid,然后当用户在tomcat-8001有登录时就把当前session的数据保存到与snaid相关的缓存中,同时把snaid设置到cookie里,当用户从tomcat-8001跑到tomcat-8002的时候,在tomcat-8002里从cookie里取出snaid,把与snaid相关连的session数据取出来复制到tomcat-8002新建的session里,最后当用户又从tomcat-8002跑到tomcat-8001的时候,如果tomcat-8001本身的session超时也没关系,新建一个session,然后再根据snaid从memcached取出session再次放回tomcat-8001容器本身的session中?
0 请登录后投票
   发表时间:2008-09-04  
Arden 写道
你的意思是给memcached的session设置一个如snaid,然后当用户在tomcat-8001有登录时就把当前session的数据保存到与snaid相关的缓存中,同时把snaid设置到cookie里,当用户从tomcat-8001跑到tomcat-8002的时候,在tomcat-8002里从cookie里取出snaid,把与snaid相关连的session数据取出来复制到tomcat-8002新建的session里,最后当用户又从tomcat-8002跑到tomcat-8001的时候,如果tomcat-8001本身的session超时也没关系,新建一个session,然后再根据snaid从memcached取出session再次放回tomcat-8001容器本身的session中?

是这个意思
0 请登录后投票
   发表时间:2008-09-05  
为什么不简单的用mem的过期时间,而要这样复制呢?
用mem过期时间的话,即使tomcat宕掉,session同样存在mem中.跨多个tomcat就更没问题了.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics