请教:怎样实现分别在两台服务器上的web应用用户的singleon?

04-06-14 zyklon
我的一个web应用,由于功能的原因必须分别部署在两台不同的服务器上,且不在同一个子网内部,我想在这两个应用上实现用户的单一登陆,用户的登录信息是封装在一个session范围内的bean里的,请高手指点一下该怎么解决?
我原来想将session保存在数据库中,然后在另外一个应用中将session复制过来的,但是我不知道怎么确定是哪个session?用户请求的URL被redirect到另一个应用后session id好像也已经变了?


zyklon
2004-06-15 12:50
我觉的这里高手很多呀,怎么没有人答我呀,是不是我的问题太简单啦?
请高手快来帮帮小弟,感激不尽

fiddle
2004-06-15 17:07
用粘贴session的负载均衡可以基本解决这个问题吧。 还是对你的问题不明确

zyklon
2004-06-15 19:45
谢谢楼上答复,
再问下有哪个负载均衡的软件可以实现粘贴session?
还是要自己加代码?

recher
2004-06-16 11:49
我自己觉得如果要在服务器断来实现,的确出现比较麻烦的处理(数据库是一个办法,或者另外需要一个均衡环境代理程序),我觉得如果不是要很高安全性,可以把一些设定用客户端来记录,(毕竟客户端不会改变)放在cookies上

fiddle
2004-06-16 16:16
反正我知道resin自带的sticky session的负载均衡方法是用session的第一个子母a、b、c、d作为服务器的标识,它会将相应的用户请求交给相应的服务器进行处理,这样就不必做session同步。唯一的问题是如果一台服务器down了,会将本来该服务器的用户请求交给别的服务器处理,相应的用户都会丢失session。

banq
2004-06-16 21:53
使用客户端加密cookie或applet啊,服务器使用支持单点登陆的集群服务器软件,如jetty/jboss。

这不是一件简单的事情,tomcat也有session cluster,你试验看看吧。

joachimz
2004-06-17 13:59

我这里采用了一个简单的做法:一个单独的登陆应用,然后每个应用由一个LoginAdaptor来接收处理登陆应用的处理结果(URL),

登陆应用:统一验证登陆,然后转交给LoginAdaptor为相应的应用进行用户授权。

LoginAdaptor:接受到"登陆应用"的处理结果后,进行授权。


CheckLogin: 检查用户是否登陆,否则转向到"登陆应用"


登陆应用

登陆请求方式是
targetApp=app1
targetURL=user_request_target_url

如果该用户在这里没有登陆过,则要求登陆,否则直接获取用户ID,根据targetApp知道相应的LoginAdaptor的url(例如http://xxx/LoginAdaptor),把用户ID,user_request_target_url等拼接成一个URL让客户redirect到
http://xxx/LoginAdaptor?user_request_target_url&authed_userid=xxx&check_key=xxx&hashed_value=xxx

LoginAdaptor
接收到上面的请求后,根据本地的方式授予authed_userid相应的权限(例如在session中设置或者设置remoteUser),然后转向到user_request_target_url处理应用,check_key和hashed_value是用来进行安全检查的(例如check_key可以与时间相关,hashed_value则是checked_key经过某种算法例如md5得到的结果)

描述有点混乱,希望能看明白和有所帮助!

seeker_zyf
2004-06-17 15:53
假如只是single sign on, 一个不错的选择是:CAS

http://www.yale.edu/tp/cas/
http://www-106.ibm.com/developerworks/java/library/wa-singlesign/?ca=dgr-lnxw1wCASsso

joachimz
2004-06-17 16:11
单看DW的介绍,果然不错。看了一下思路,与我的实现方法大同小异,当然更灵活更安全。这张图片
<img src="http://www-106.ibm.com/developerworks/java/library/wa-singlesign/figure1.gif" />
把他的原理说得很明白。

有使用经验吗?不知道使用起来是否麻烦?有时间要研究一下,看是否有必要,能不能替换目前自己的实现!