首先声明,本文中谈及的心得,有很多是尚未得到客观性验证的,纯属笔者在工作实践中的经验之谈,拿来与大家分享,希望大家在工作中碰到相同问题时,能得到快速解决。
这些问题的解决方式都是笔者自己实践摸索的(在google和几大论坛上没找到相关资料
),如果有说的不对的,有高人知道确切的原因的,请不吝赐教,先谢过!
问题1:关于相同域名下多个应用集成的session冲突。
问题背景:
公司要集成3个应用到portal上,包括:OA、ERM和HR。开始时,规划使用统一的域名oa.xxxxxtechnology.com。由于HR是外购的系统,并且只能部署与tomcat5.5的root路径下,因此单独部署一个Tomcat服务器实例,占用8080端口。OA和ERM共同部署在一个Tomcat6.0下,ERM部署与root路径下,OA部署在/OA的路径下,两个应用都占用80端口。三个系统集成在同一个portal平台上,页面采用DIV嵌IFrame方式集成,系统间采用CAS实现SSO。
出现的问题:
用户登录后,在OA系统和ERM系统间切换运行正常,但进入到HR系统后,再切到ERM系统,发生session过期,而从HR切入OA系统则不会。
实验发现的原因
虽然HR与ERM部署与不同的Tomcat,并且采用不同的服务端口,但由于使用相同的域名oa.xxxxtechnology.com,且应用路径都是root,对于浏览器而言,他们共用相同的Session,因此会发生session覆盖问题。
笔者作了相关的实验,证明HR与ERM的session是相互覆盖的。
实验结论是,浏览器依靠域名和应用的上下文路径来建立session关联,且与端口号无关。反过来,也证实了同一个应用可以使用多个端口。
解决方式
1.采用不同的上下文,如,将ERM的上下文路径从root变为/erm
2.采用子域名,如,将HR映射为hr.xxxxxtechnology.com,将ERM映射为erm.xxxxxtechnology.com.
问题2:关于IE6.028xxx版本的重定向问题(应该是BUG)
问题起因:
这个问题发生的有些诡异,目前我们对其没有很明确的解释。因此我们倒过来,先说结果。
问题发生在CAS的sso中。造成问题的原因有两个:
1.CAS的一个认证URL配置错误。我们将https://oa.xxxxxtechnology.com:9443/cas/login的链接配置成了https://oa.xxxxxtechnology.com:9443/cas/logi,少了一个n。
2.IE6.028版本的redirect处理存在bug
问题的表象
1.我们在
除了IE6.028xxx版本外的其他浏览器上运行都正常,这包括了windows2003和XP上的IE6.039xxx,Firefox3.0,Google Chrome1.0.x等。唯有windows2000下IE6.028xxx版本不能正常重定向。
在IE6.028xxx上,最终显示的重定向链接是https://oa.xxxxxtechnology.com/cas/login
从这个表象上看,更像是端口号丢失,而不是链接写错,这个误导了我们很久一段时间。
2.使用正确的链接进行重定向后,页面上的图片和css都无法正确载入,后来发现页面base path中端口号不对,原因是request.getServerPort()方法返回的端口号是错的。
问题的一个猜想
通过sniffer软件对Http请求报文的分析发现,对于CAS的重定向请求,Tomcat返回给浏览器的是HTTP302 Temporarily Moved应答,且重定向的URL为(错误的)https://oa.xxxxxtechnology.com:9443/cas/logi。对于这个应答,浏览器会尝试重定向URL,但如果给定的URL失败,应该会采用相似的URL进行匹配,这点是笔者的猜测,否则无法解释错误的URL https://oa.xxxxxtechnology.com:9443/cas/logi到了浏览器端会被替代成https://oa.xxxxxtechnology.com:9443/cas/login。
问题中发现一个IE6.028xx的BUG
IE6.028xxx版本对HTTP302 Temporarily Moved的重定向采用HTTP1.0协议,而不是HTTP1.1协议(同样的请求在Firefox3.0中是HTTP1.1协议)。最关键的是它对于相同HOST上不同端口的redirect存在端口号不更改的BUG,就是说,如果你从http://www.aaa.com:8080/aaa.html重定向到http://www.aaa.com:9443/bbb.html时,HTTP1.0的头部HOST属性中仍然是8080端口,这个bug被实验验证是存在的。当然如果HOST的名字不同,则不会出现这个bug。
解决方法
将CAS部署和OA服务器分离,让CAS服务使用cas.xxxxxtechnology.com的二级域名。
问题总结
1.因为一个重定向链接不正确,造成了浏览器采用了URL的自动匹配策略算法,目前对这种自动匹配,本人尚未找到官方资料证实,只是从表象上推测。
2.URL的自动匹配算法使用到了HTTP head中的HOST属性,但是IE6.028版本对于相同HOST上不同端口的redirect过程,存在bug,不会修改head中host属性的端口号。(这也是造成上述假象的根本原因)
3.IE6.028版本中的对HOST属性的错误,会影响servlet中request.getServerPort()这个方法的结果,造成JSP页面的相对路径不正确。
经验总结
在一个企业应用环境中集成多个系统,不论是portal还是ESB/SOA的实施,建议给每一个应用一个二级域名。这样既可以解决js在页面上跨域调用的问题,又可以保证应用session的相对独立,还可以避免部分浏览器bug造成的redirect问题!
因为问题比较复杂,咖啡已经尽力的试图将问题说清楚了,不过看起来还是有点晕
分享到:
相关推荐
### 单点登录(SSO)技术解析:同域名与不同域名下的实现 #### 背景介绍 在企业的早期发展阶段,所使用的内部系统数量有限,通常为一两个,每个系统都配备有自己的登录模块。这样的架构对于运营人员来说非常便捷,...
SSO是一种身份验证机制,允许用户在登录一个应用系统后,无需再次输入凭证即可访问与其相互信任的其他应用系统。在企业环境中,这样的功能能够极大提升用户体验,同时简化管理,降低安全风险。 PHPSSO的设计目标...
Java单点登录(Single Sign-On, SSO)的实现是一个复杂但重要的任务,尤其是在大型企业或组织中,它能够提供用户友好的访问体验,减少多次输入凭证的繁琐过程。SSO技术的应用通常涉及到多系统间的身份验证整合,使得...
普元SSO(Single Sign-On)单点登录集成指南是一份详细指导文档,它主要介绍普元信息技术股份有限公司提供的SSO组件的集成原理、集成方法和配置流程,目的是为了实现用户在多个应用系统间无需重复登录即可切换的体验...
SSM项目集成Shiro搭建session共享是一个常见的需求,特别是在构建分布式系统时,为了实现用户登录状态在多个服务器间的一致性。在这个项目中,我们使用了SpringMvc4.3、Spring4.3、Mybatis3.4作为基础框架,Shiro1.4...
在Swift开发中,集成第三方应用,尤其是社交网络的分享功能,是提高用户互动性和便利性的重要手段。这里我们将深入探讨“swift-社交分享包含绑定第三方账号SSO应用跳转”这一主题,以及如何通过`WBShare-master`这个...
对于位于同一域名或不同域名下的子域名应用程序,SSO的实现主要依赖于共享会话管理和认证信息。这通常涉及到在中央认证服务器上进行登录,然后该服务器将认证信息转发给所有相关应用,或使用统一的会话ID和cookie...
SSO单点登录技术是现代企业级应用架构中不可或缺的一部分,它通过统一的身份认证服务提升了用户体验,降低了运维复杂度。"Simple-SSO"项目为开发者提供了一个学习和实践SSO的平台,结合Maven的项目管理,使得分布式...
- CAS客户端库可集成到Java应用中,实现SSO登录。 2. **OAuth**: - 主要用于授权而非认证,但可以扩展为SSO方案。 - OAuth 2.0是目前广泛采用的版本,支持第三方应用的访问控制。 3. **OpenID Connect**: - ...
标签中的"源码"可能是指提供了一段实现SSO的代码示例,而"工具"可能指的是使用了一些辅助工具,例如CAS服务器的安装和配置,或者是OAuth2.0库的集成。 在提供的压缩包文件`sso-client1`中,可能包含了一个SSO客户端...
在SSO系统中,用户只需登录一次,就可以访问多个相互关联的应用程序,无需多次输入认证信息。本项目使用session和cookie技术来实现这一功能,下面我们将详细探讨这些关键知识点。 首先,我们要理解**session**和**...
ASP.NET SSO(Single Sign-On)单点登录是一种网络身份验证机制,允许用户在一个应用系统中登录后,无须再次输入凭证即可访问其他相互信任的应用系统。这种技术极大地提升了用户体验,减少了频繁输入用户名和密码的...
SSO Agent 负责管理操作员的登录/退出流程,操作员在应用中的SSO 的Session管理,并具SSO Agent 负责收接应用发送过的操作员登录,退出等信息交给应用进行处理。这种方式对应用接入的开发来说,优点是开发工作量比较...
文档中提到了Kisso的基本概念和实现单点登录(SSO)的技术细节,具体包括服务端和客户端的集成步骤以及相关配置文件的设置。 知识点详细说明如下: 1. Kisso单点登录原理: - Kisso实现单点登录(SSO)使用的是加密...
4. **会话管理**: 子应用在接收到验证结果后,可以创建自己的会话(Session),并将SSO服务器返回的用户信息存储在本地,以便后续请求中快速判断用户状态。 此外,为了确保安全性,还需要考虑以下几点: - **安全...
当用户登录一个应用时,会在所有关联应用中设置相同的Session ID,从而实现跨应用的身份验证。 - **基于Token的SSO**:例如OAuth和OpenID Connect,用户通过第三方认证服务器获取访问令牌(Token),然后使用这个...
单点登录(Single Sign-On,简称SSO)是企业级应用系统中常用的一种身份验证机制,它允许用户在一次登录后,就能访问多个相互关联的应用系统,而无需再次输入凭证。这个“企业级SSO单点登录demo”显然是为Java开发者...
SSO(Single Sign-On)单点登录是一种网络身份验证机制,允许用户在一次登录后访问多个相互关联的应用系统,而无需再次输入凭证。这个技术在现代企业信息化建设中扮演着重要角色,因为它提供了便捷的用户体验,同时...
SSO单点登录解决方案 SSO(Single Sign-On)单点登录解决方案旨在提供一个统一的身份验证入口,满足集团多个成员网站的身份验证需求。该方案的主要目标是实现单点登录,提高用户体验,降低成员网站的登录负载,并...