有两个问题(tomcat session相关)请教一下大家!

单车架构师 发布于 2011/02/15 11:21
阅读 2K+
收藏 4

我有两问题在这里请教一下大家!

背景:有一个Web应用,发布时服务器架构采用apahce + tomcat(3个)。同时有另一个应用是前述应用的wap版(java开发),准备再用一个tomcat发布。

问题一:web应用的3个tomcat没有做集群,session也没有复制,因为觉得tomcat的那种所有session都复制的办法不是太好,而且很不稳定(时而可复制,时而不能复制)。我想把这3个tomcat产生的session都放在另一台机器上(重新写session保存模块),由它专门管理,所有登录都到这台机器上来做,这样不管哪个tomcat挂掉,对用户来说透明,不要再登录。

问题二:wap应用和web应用也共用session,同时要求客户端(不管是手机还是PC)同一用户同一时间只能在系统中登录一个身份。也就是说,一个用户登录,如果在别的机器(或不同浏览器,手机)上再登录,前面登录的用户会被挤出系统。

以上两问题请大家帮忙提个具体的解决方案,谢谢!前述是我自己的想法!

以下是问题补充:

@安立国:我有两个应用,在同一台服务器上,装了两个tomcat 在应用中发现,在登录A系统时,如果在登录B系统,A系统的 session就会超时退出,请问是什么问题 (2011/06/23 14:54)
加载中
1
红薯
红薯

1. Tomcat的Session分布式存储思路
http://www.oschina.net/bbs/thread/4544

在分布式应用中,最好不要用session,使用cookie来处理用户登录的token

0
jobell
jobell

推荐是采用集中式session处理的。用memcached存储session。

要判断同一个用户登录,在memcached中可以根据用户名去查找。存在即登录。

唯一难控制的就是如果直接退出浏览器,session的清除问题:

我的解决方案就是所有的页面都跑在frame里,然后在页面上加一个unbound函数。处理退出。

0
太阳花
太阳花

问题1,我同意3楼的前部分观点,采用无状态行更容易水平扩展、资源占用少

客户端:使用cookie,cookie内仅保存会话标识符

服务器端:采用memcached保存会话消息(仅保存用户信息,权限)

至于session清楚的问题,应该写一个线程扫描memcached里会话信息,超时删除,

3楼的缺点:1,多tab浏览器,2多窗口,关掉一个窗口不能销毁session,其他窗口也公用一个session

问题2,其实使用memcached集中管理的话,很容易实现:根据登录名到memcached早session id,找到删除会话信息

0
jobell
jobell

引用来自#4楼“张学化”的帖子

问题1,我同意3楼的前部分观点,采用无状态行更容易水平扩展、资源占用少

客户端:使用cookie,cookie内仅保存会话标识符

服务器端:采用memcached保存会话消息(仅保存用户信息,权限)

至于session清楚的问题,应该写一个线程扫描memcached里会话信息,超时删除,

3楼的缺点:1,多tab浏览器,2多窗口,关掉一个窗口不能销毁session,其他窗口也公用一个session

问题2,其实使用memcached集中管理的话,很容易实现:根据登录名到memcached早session id,找到删除会话信息

现在的问题就在于超时的处理 不正常退出的情况

没有触发的动作,所以没有办法保证及时的清除session。

比如:我刚断电了,然后重新上来登录,不让登录《错误就是该用户已经登录》原因就是没有session没有清除。


0
太阳花
太阳花

引用来自#5楼“joliny”的帖子

引用来自#4楼“张学化”的帖子

问题1,我同意3楼的前部分观点,采用无状态行更容易水平扩展、资源占用少

客户端:使用cookie,cookie内仅保存会话标识符

服务器端:采用memcached保存会话消息(仅保存用户信息,权限)

至于session清楚的问题,应该写一个线程扫描memcached里会话信息,超时删除,

3楼的缺点:1,多tab浏览器,2多窗口,关掉一个窗口不能销毁session,其他窗口也公用一个session

问题2,其实使用memcached集中管理的话,很容易实现:根据登录名到memcached早session id,找到删除会话信息

现在的问题就在于超时的处理 不正常退出的情况

没有触发的动作,所以没有办法保证及时的清除session。

比如:我刚断电了,然后重新上来登录,不让登录《错误就是该用户已经登录》原因就是没有session没有清除。


及时清除session你是不可能做到的,除非不是http协议或保持类似comet的长连接,及时清除的问题,大多数情况下不应考虑

1,正常退出的情况,直接获取客户端cookie的会话标识符,删除memcached里的会话信息,这是用户的主动意愿

2,不正常退出都不用管它(例如断网、关闭浏览器等复杂原因)是你无法左右的。你只能控制的是服务器端会话信息,memcached里的每个会话信息都有超时时间,任务线程扫描会话信息的超时信息,超时删除。http是无状态的,你没必要保证及时销毁session,何况如果没有长连接,你无法做到的

3,再说已经登录的问题,既然你重新登录,那这个session id与已经登录的session id就不一样了,不让登录说明你的处理方式不是用session id找用户而是用 用户信息去找session,如果仅允许用户在一个地方登录,仅需用登录的用户名去找旧 session(当然要有username-sessionid, sessionid-userinfo,key-value的映射)删除,然后把新session信息保存在memcached里

 

0
单车架构师
单车架构师

谢谢你们回答!

返回顶部
顶部