JBOSS单点登录SSO解决方案

跨war包session同步解决方案
【功能点】
不同war包间session共享
【关键需求理解】
多系统间实现统一登陆(单点登陆),对用户屏蔽多个独立系统的存在,给用户提供一个整体统一的系统。
【实现逻辑描述】
用一个类的静态hashmap域来存放公共session信息,我们可以称之为session容器,其中key为sessionID,value为一个简单SessionUser对象。
对各个系统的访问都通过filter过滤,在filter中根据当前的sessionID判断容器是否存在该sessionID,如果不存在,则重定向到统一登陆页面,如果存在,而且当前session中不存在登陆信息,则在SessionManager中增加有效session个数,并在当前session中添加登陆信息。
当用户在一个系统中退出时,在SessionManager中删除该session信息。
当系统1超时时(通过EBossUserSessionListener监听session是否超时),在SessionManager中减少该sessionID对应的session的有效个数,当有效个数<1时,在容器中删除.

 

各个war的web.xml中添加如下节点:
<filter>
<filter-name>EBossUserFilter</filter-name>
<filter-class>com.sitechasia.sessionResearch.ebossUser.EBossUserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EBossUserFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener> <listener-class>com.sitechasia.sessionResearch.ebossUser.EBossUserSessionListener</listener-class>
</listener>
在war上级的lib中添加ssosession.jar。
【代码实现的优点】
通过一个hashMap实现session的统一管理,通过sessionUser中的有效session数来记录当前用户已经登陆的系统个数,当某个系统的session失效时,不影响整个系统的访问(只要有一个系统的session没有失效就可以访问全部系统),当所有系统的session都失效时,则不能访问任何一个系统。
通过EBossUserSessionListener实现session会话的监听。
【代码实现中的一些缺点】
此实现只能针对在同一个应用服务器下发布的各个系统,要求各个系统的域名相同,系统使用java语言。各个系统是通过页面的链接实现统一访问的。
需要基于以下条件:在一个浏览器窗口中访问相同域名内的各个系统时,生成的sessionID是相同的,在这个窗口中通过点链接打开的新窗口访问相同域名内的各个系统时,生成的sessionID也是相同的。
【如何改进】
为克服以上缺点,可以考虑通过程序控制sessionID的生成,编写一个sessionID生成算法;
将静态类容器的实现扩展为数据库方案的实现,这样可以脱离具体语言的限制,但使
用数据库方案时,因为访问任何一个页面都需要得到用户的登陆信息,势必会引发性能问题,应该针对可能引起的性能问题寻找一个适当的解决方案。

猜你喜欢

转载自zzc1684.iteye.com/blog/1614026
今日推荐