背景
我有两个 webshpere 应用程序
- app1 开启http://example.com:9080/app1
- app2 开启http://example.com:9081/app2
(安装在两个单独的配置文件上,并且端口和上下文根都不同)
设想
- 登录 app1 时,用户会获得一个 JSESSIONID cookie X
- 在另一个浏览器选项卡(IE8)中登录 app2 时,用户会获得 JESSSIONID cookie Y
问题
- 当登录 app2 时,JSESSIONID cookie 值 Y 会覆盖值 X,从而使 app1 的会话无效(如果用户执行任何操作,都会被返回到登录页面)
问题
- 这是默认行为吗?两个 Web 应用可以共享一个 JSESSIONID cookie,这看起来很奇怪
- 有没有办法配置两个 Web 应用程序以实现 JSESSIONID cookie 隔离?
答案1
由于这两个应用位于不同的配置文件中,因此它们彼此不了解。因此我预计第二个应用会看到它无法识别的会话 ID,并认为该 ID 已过期,然后创建一个新的会话 ID。
您可以将应用程序的 cookie 名称之一更改为 JSESSIONID 以外的其他名称,或者可以更改其路径,以便仅为 /app1 或 /app2 发送回它。
无论是服务器范围的Servers
> 服务器名称 > Session Management
>Enable Cookies
还是特定应用程序的Enterprise Applications
> 应用程序名称 > Session Management
> Enable Cookies
。如果选择后者,您还必须检查Override session management
。
答案2
也许你应该设置特定于应用程序的cookie 路径这样您就可以限制发送 cookie 的 URL。
Override session management
这可以通过启用Enterprise Applications > AppName > Session management
并选择Enable cookies > Cookie path > Set cookie path
等于应用程序的上下文根来实现,例如等于应用程序1或者应用2。
在我看来,这是隔离在同一主机中运行的应用程序的 cookie 的最可取的方法。
答案3
还有一种替代(AIUI,首选?)解决方案来更改 cookie 名称或添加路径组件 - 您可以将两个应用程序配置为重新使用传入的会话 ID 并以此为基础创建会话。
答案4
我在我的环境中遇到了同样的问题。尽管在两个应用程序中都更改了 cookie 路径,但我只更改了一个应用程序 cookie 路径并启用了覆盖会话管理。进行更改后问题得到解决。