应用的Session冲突
分类: 服务器
使用apache反向代理解决在应用A使用Iframe嵌入应用B的功能而产生的跨域问题后,应用B的功能能正常使用了。但也产生了另外一个问题:打开应用A的任何页面都会跳转主页,问题原因是:session丢失。
具体分析:
session是通过在客户端生成一个cookie,所有请求会带上这个cookie。一个cookie的NAME、Domain和Path属性值均相同,则会覆盖,若未设置Domain域,则域为ip(不包括端口),因此应用A的session被应用B的session覆盖了。
经测试:tomcat、weblogic、websphere的session默认都是JSESSIONID 为key来识别的,因此在没有特别设置下,同一个域下的多个应用session会互相覆盖。
解决办法:
设置各个应用使用不同的cookie-name,或者将JSESSIONID的path路径设置为不同。
1)WebLogic的Cookie相关配置:weblogic.xml
属性名 | 默认值 | 值 |
cookie-name | JSESSIONID | 如未设置,默认为“JSESSIONID” |
cookie-path | NULL | 如未设置,默认为“/” |
cookie-domain | NULL | 如未设置,默认为发放cookie的服务器的域 |
示例代码:
1. <session-descriptor>
2. <session-param>
3. <param-name>CookieName</param-name>
4. <param-value>XXX_SESSIONID</param-value>
5. </session-param>
6. </session-descriptor>
延伸阅读:
2)websphere的设置(设置不同JSESSIONID的path)
应用程序->企业应用程序-> [Application Server] ->
会话管理->1.覆盖会话管理(需打钩).
会话管理->2.启用 cookie(需打钩)->修改‘Cookie路径’
3)Tomcat的设置(设置不同JSESSIONID的path)
修改tomcat/conf/server.xml:
1.tomcat5修改方法
在启动项中增加org.apache.catalina.SESSION_COOKIE_NAME参数
linux
1 | JAVA_OPTS='-Dorg.apache.catalina.SESSION_COOKIE_NAME=yousessionname'
|
win
1 | set JAVA_OPTS='-Dorg.apache.catalina.SESSION_COOKIE_NAME=yousessionname'
|
2.tomcat6和tomcat7修改方法相同
在Context容器标签上增加sessionCookieName参数
<Context path=”/” docBase=”webapp” reloadable=”false” sessionCookieName=”yoursessionname”></Context>
还可以加上sessionCookiePath
<Context … sessionCookiePath=“/” > … </Context>
延伸阅读:tomcat修改jsessionid在cookie中的名称 http://blog.shilimin.com/338.htm