weblogic访问网页时session丢失的问题_jsp session

问题:部署3个应用(访问IP相同,域名不同,端口不同),3个应用之间的session 相互影响

原因:session是通过在客户端生成一个cookie,所有请求会带上这个cookie,(例如在weblogic中默认这个cookie的名称为JSESSIONID),例如都是发布在weblogic下,则互相访问时,由于未设置cookie-name,默认cookie-name是JSESSIONID,因此客户端中的cookie会互相覆盖,从而导致session混乱

一个cookie的NAME、Domain和Path属性值均相同,则会覆盖,若未设置Domain域,则域为ip(不包括端口),因此三个应用的session cookie就会互相覆盖

解决办法:设置各个应用使用不同的cookie-name,或者将JSESSIONID的path路径设置为不同

1)weblogic的设置(设置不同的cookie-name):

请在WEB-INF\Weblogic.xml添加如下代码

<session-descriptor>      

        <cookie-name>JSESSIONID1</cookie-name>  

</session-descriptor> 

2)websphere的设置(设置不同JSESSIONID的path)

应用程序->企业应用程序-> [Application Server] ->
会话管理->1.覆盖会话管理(需打钩).
会话管理->2.启用 cookie(需打钩)->修改'Cookie路径'

参考文档:

资料一:

在将LWAP开发的应用迁移为Oracle ADF来开发的过程中,LWAP和ADF应用都部署在同一个Weblogic服务器的两个Domain下,

当在IE中首先访问ADF应用,然后再另外一个标签页中访问LWAP应用,就会发现ADF应用出现问题,就会发现session丢失。

问题是由于客户端访问ADF应用时,对应的Weblogic域会保留一个名为JSessionId的Cookie,记录ADF域的信息,JSessionId为

Weblogic cookie-name的默认值,而当再次访问LWAP时,客户端Cookie中的JSessionId的值被LWAP的域修改了,此时再次访问

之前的ADF应用就会导致Session丢失。

网上可以找到关于这个问题的解决方案:

1,设置web应用的Cookie名称,让它们拥有不同的JSessionId

在LWAP和ADF的weblogic.xml文件添加如下属性

<session-descriptor>
<session-param>
<param-name>CookieName</param-name>
<param-value>HADFCookie</param-value>
</session-param>
</session-descriptor>

2,一个应用使用IP来访问,另外一个应用使用域名来访问

一、现象:

在WebLogic中,有两个不同域A(端口:9000)和B(端口:8000),应用CA在域A中,应用CB在域B中,进行如下操作:

1、先登录应用CA,再登录应用CB,然后,切换回应用CA,发现应用CA的Session丢失;

2、应用CA中有指向应用CB的链接,登录应用CA,点击指向应用CB的链接,应用CA的Session丢失;

二、原因:

因Cookie冲突导致Session丢失。

Cookie的覆盖机制:如果一个新的cookie与一个已存在的cookie的NAME、Domain和Path属性值均相同,则旧的cookie会被丢弃。(参考:http://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_cookies

WebLogic的Cookie相关配置:

属性名

默认值
cookie-nameJSESSIONID如未设置,默认为“JSESSIONID”
cookie-pathNULL如未设置,默认为“/”
cookie-domainNULL如未设置,默认为发放cookie的服务器的域

由于没有在Weblogic.xml配置文件中对cookie的相关属性值进行配置,因此应用CA和应用CB的cookie的Name、Domain和Path属性值均为默认值,即Name为JSESSIONID,Path为“/”,Domain为服务器的IP地址,三个属性值均相同,这就造成了应用CA的cookie与应用CB的cookie会互相覆盖,从而导致相应应用的session丢失。

三、解决办法:

在Weblogic.xml配置文件中增加Cookie的相应属性值的配置:

方法1:设置各应用的cookie的Name属性为不同值

方法2:设置各应用的cookie的Path属性为不同值(cookie的Path属性值需与context-root值保持一致,context-root若未在Weblogic.xml中指定则默认为部署的WAR包名或文件夹名,若同一Weblogic服务器不同域中的两应用context-root相同,则此方法不可行)

附注:虽然问题是在WebLogic下的不同域部署应用进行互访的情况下发现的,但是,从问题产生的原因来看,在同一个域中的不同应用的互访,如果未做cookie相关属性值的配置,也会出现cookie冲突的问题。

资料二:

1 关于WebLogic的Session丢失的问题
http://blog.csdn.net/DesignLife/article/details/2552186
2 tomcat向weblogic移植出现的问题系列 - session丢失问题
(其中一位网友回答不知是什么意思,要加什么文件)
http://netliving.iteye.com/blog/148485
3 java weblogic session 丢失
http://hi.baidu.com/leftstone/blog/item/3b34a4a19d4d0588471064f0.html
4 weblogic两个domain中jsp相互调用session丢失解决方法
http://www.4ucode.com/Study/Topic/1159787
5 关于WebLogic的Session丢失的问题
http://hi.baidu.com/goylsf/blog/item/d2446677d71e070ab051b98d.html
6 weblogic通过代理插件weblogic.servlet.proxy.HttpProxyServlet跨域访问导致session丢失问题的解决
http://ribbonchen.blog.163.com/blog/static/1183165052011074500877/
7 WebLogic如何设置session超时时间
http://tonyaction.blog.51cto.com/227462/201900
注意网上有很多的Webloigc不是最新的配置
位于WEB-INF/WebLogic.xml配置如下:

Java代码 复制代码 收藏代码 2011年12月21日 - 龙卷风 - 龙卷风 ---小谢
  1. <?xml version='1.0' encoding='utf-8'?>   
  2. <weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90"   
  •                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  •                  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
  •                  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd    
  •                  http://www.bea.com/ns/weblogic/90    
  •                  http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">   
  •     <container-descriptor>  
  •         <prefer-web-inf-classes>true</prefer-web-inf-classes>  
  •     </container-descriptor>  
  •     <context-root>/</context-root>  
  •     <session-descriptor>  
  •         <!--WebLogic设置Session超时时间,在web.xml中去掉session超时设置  -->  
  •         <!-- <timeout-secs>7200</timeout-secs> -->  
  •         <cookie-name>JSESSIONID1</cookie-name>  
  •     </session-descriptor>  
  • </weblogic-web-app> 
    <?xml version='1.0' encoding='utf-8'?>   <weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd         http://www.bea.com/ns/weblogic/90         http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">    <container-descriptor>    <prefer-web-inf-classes>true</prefer-web-inf-classes>   </container-descriptor>   <context-root>/</context-root>   <session-descriptor>       <!--WebLogic设置Session超时时间,在web.xml中去掉session超时设置  -->    <!-- <timeout-secs>7200</timeout-secs> -->    <cookie-name>JSESSIONID1</cookie-name>   </session-descriptor>  </weblogic-web-app>  


    一 WebLogic设置Session超时
    1 web.xml
    设置WEB应用程序描述符web.xml里的<session-timeout>元素。这个值以分钟为
    单位,并覆盖weblogic.xml中的TimeoutSecs属性

    Java代码 复制代码 收藏代码 2011年12月21日 - 龙卷风 - 龙卷风 ---小谢
    1. <session-config>  
    2.     <session-timeout>30</session-timeout>  
    3. </session-config> 
    <session-config>      <session-timeout>30</session-timeout>  </session-config>


    此例表示Session将在54分钟后过期
    当<session-timeout>设置为-2,表示将使用在weblogic.xml中设置的
    TimeoutSecs这个属性值。
    当<session-timeout>设置为-1,表示Session将永不过期,而忽略在
    weblogic.xml中设置的TimeoutSecs属性值

    该属性值可以通过console控制台来设置
    在weblgoic的console中:xxDomain->Servers->xxServer->Protocols->HTTP 中有一个关于Post Timeout的配置,但这个参数一般使用默认值即可
    一般是通过Services-->JDBC-->Connection Pools-->MyConnection(你所建立的连接池名)-->Configration-->Connections 里的Inactive Connection Timeout这个参数来设置的,默认的为0,表示连接时间无限长。你可以设一个时间值,连接超过这个时间值,它会把连接强制放回连接池

    Java代码 复制代码 收藏代码 2011年12月21日 - 龙卷风 - 龙卷风 ---小谢
    1. <Server AcceptBacklog="62" CompleteHTTPMessageTimeout="480" 
    2. CompleteMessageTimeout="480" IdleC  
    3. ListenAddress="" ListenPort="7001" Name="myserver" 
    4. NativeIOEnabled="true" ReliableDeliveryPolicy="RMDefaultPolicy" 
    5. ServerVersion="8.1.4.0"
    <Server AcceptBacklog="62" CompleteHTTPMessageTimeout="480"  CompleteMessageTimeout="480" IdleC  ListenAddress="" ListenPort="7001" Name="myserver"  NativeIOEnabled="true" ReliableDeliveryPolicy="RMDefaultPolicy"  ServerVersion="8.1.4.0">


    是否IdleConnectionTimeout参数
    2 weblogic.xml
    设置WebLogic特有部署描述符weblogic.xml的<session-descriptor>元素的
    TimeoutSecs属性。这个值以秒为单位

    Java代码 复制代码 收藏代码 2011年12月21日 - 龙卷风 - 龙卷风 ---小谢
    1. <session-descriptor>  
    2.         <!--WebLogic设置Session超时时间,在web.xml中去掉session超时设置  -->  
    3.        <timeout-secs>7200</timeout-secs>          
    4. </session-descriptor> 
    <session-descriptor>       <!--WebLogic设置Session超时时间,在web.xml中去掉session超时设置  -->      <timeout-secs>7200</timeout-secs>     </session-descriptor>



    二 防止Webloigic下的iframe的Session失效
    请在Weblogic.xml添加如下代码

    Java代码 复制代码 收藏代码 2011年12月21日 - 龙卷风 - 龙卷风 ---小谢
    1. <session-descriptor>      
    2.         <cookie-name>JSESSIONID1</cookie-name>  
    3. </session-descriptor> 
    <session-descriptor>       <cookie-name>JSESSIONID1</cookie-name>  </session-descriptor>


    原来session在服务器端生成后分配的sessionID在客户端的保存方式是个cookie,它的生命周期在浏览器关闭后就会结束,而这个cookie的名字如果不特别设置,weblogic会以默认的名称“JSESSIONID”来设置这个cookie的名称,我两个应用的的session cookie名字都没有设置,客户端在第一次通过应用A请求代理转发到应用B时,应用B返回的同名session cookie覆盖了客户端原本的应用A的session cookie,所以导致了应用A session的丢失。
    解决方法是,在应用B的weblogic.xml中的session descriptor标记中添加session cookie的名称设置,使其区别于A应用的session cookie名称.其中的cookie-name可以重命名!解决在iframe中进行跨域访问时session丢失的问题
    附件有:weblogic-web-app.xsd

    资料三:

    Tomcat改变JSESSIONID Set-Cookie的 Path

    Set-Cookie: JSESSIONID=6941712CDVA075E14PF0C8DB15UF78E5; Path=/mywebapp

    如果想将Path=/mywebapp 转为 /
    即:
    Set-Cookie: JSESSIONID=16FB366B425C1EECD229BE1A395FD37C; Path=/

    修改tomcat/conf/server.xml:

    Xml代码 复制代码 收藏代码 2011年12月21日 - 龙卷风 - 龙卷风 ---小谢
    1. <Connector port="NN" maxHttpHeaderSize="8192" 
    2.            maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
    3.            enableLookups="false" redirectPort="NN" acceptCount="100" 
    4.            connectionTimeout="20000" disableUploadTimeout="true" 
    5.            emptySessionPath="true" 
    6.             /> 
        <Connector port="NN" maxHttpHeaderSize="8192"                 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"                 enableLookups="false" redirectPort="NN" acceptCount="100"                 connectionTimeout="20000" disableUploadTimeout="true"                 emptySessionPath="true"                  />  


    上面是针对tomcat6的,如果是tomcat7,emptySessionPath该属性无效,
    需要在context.xml加sessionCookiePath:
    <Context ... sessionCookiePath="/" > ... </Context>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值