当前门户系统使用iframe内嵌了多个应用,多个应用间使用单点登陆实现一次登陆,并且有一个退出的按钮用来退出门户系统,注销单点登陆。
存在问题:门户登陆成功后,点击退出是可以正常退出的,但是切换到应用A,再点退出,发现退出不了。
分析问题的根源:
1:门户登陆成功后,从单点登陆服务中获取到ticket,校验成功后,设置sessionId _const_cas_assertion_
下一次访问时,会根据是否存在key为_const_cas_assertion_的session,判断是否登陆过。
2:切换到应用A时,因为单点登陆,应用A无需再次登陆,即可从单点登陆服务器中直接回跳到应用,然后设置sessionId _const_cas_assertion_
3:点击门户的退出按钮,发现应用并没有重定向到单点登陆的退出地址,反而是到登陆地址去做登陆,导致页面进行了一次登陆刷新。
查看后端代码发现,获取到的sessionId为空,导致门户认为当前的访问请求没有进行登陆验证,从而将请求重定向到登陆地址去。
是什么导致门户的sessionId失效呢 ,我们发现是由于点击应用A后导致的,怀疑是sessionId被覆盖引起的。
session是通过在客户端生成一个cookie,所有请求会带上这个cookie。一个cookie的NAME、Domain和Path属性值均相同,则会覆盖,若未设置Domain域,则域为ip(不包括端口)。
查看对应的JSESSIONID发现 ,门户和应用A都没有设置上下文(默认path/),导致门户的sessionid被应用A覆盖。
解决办法:为门户设置一个上下文。成功解决sessionid 被覆盖的问题。