最近在使用weblogic时,在一台机器上创建了两个domain,一个web项目发布到domain1上,端口是7001;另一个web项目发布到domain2上,端口是7002。
两个web项目都是通过过滤器校验session,并执行权限认证,如果校验失败则页面跳转到登录页面。
当我把两个domain都启动起来时,访问两个网站时,总是出现session丢失的情况。表现在IE上就是,当随便操作某个页面一两下后,就重新跳转到登录页面了。domain1和domain2上的网站都频繁出现这种情况。为了跟踪这种情况,在web.xml中增加了sessionListener类把session信息打印到控制,结果发现两个项目domain的控制台总是频繁打印出“Session XXXXXXXX created!”,新创建出来的sessin每个session id都不一样。可以确认是session频繁丢失而造成,页面频繁重新登录。
在google上搜了一下,发现有人也遇到过这种情况,
摘自网上的一段描述“
……怀疑是Tomcat和 Weblogic这两个不同的Web容器在处理方式上有差别,于是就在过滤器中加入了一些输出信息,通过观察发现了用户的sessionid在 Weblogic上跳转前后发生了变化,而
在Tomcat上跳转前后则不会有任何变化。页面的跳转是通过 response.sendRedirect("xxx.jsp")来实现的,因此怀疑Weblogic在这个方法的处理上跟Tomcat上不同而导致错误产生(很愚蠢的
怀疑,这也导致我在查找问题的方向上出现了错误),一直认为可以通过修改Weblogic的weblogic.xml这个文件来解决,在网上搜了很多,也在看了一天weblogic的资料,都没有解决。后来
无意中发现了一个问题,我如果访问的资源都是本地服务器上的,那么去认证之后就不会报错,如果是其他服务器的(其他服务器也使用同一个认证服务器做认证)则会出现上述问题,对
cookie做了进一步的跟踪,发现cookie里面的 jsessionid在访问了其他服务器之后就被修改了,也就是原来的jsessionid不见了。同样的事情,在tomcat上就不会出现(到现在我还认为是
Tomcat和Weblogic的差别)。在Google上搜索了N遍无果之后,在Baidu上终于结果了,有人遇到过跟我相同的问题,这个问题并不是Tomcat和Weblogic的差别引起的,我在查找问题原因的时
候忽略了一个细节,也就是迁移到的Weblogic服务器上,和另外几个服务器 (包括认证服务器)都在同一个IP地址的不同端口下,也就是在同一个域下,而这就是问题的所在。是访问了同一
个服务器而导致了jsessionid发生了覆盖(客户端保留一个名为 JSessionID的Cookie),
解决方法很简单。
如下:两个web使用不同的sessionid来标识,如第一个web使用jsessionid1,第二个web使用 jsessionid2就可以了。 直接在每个web程序下配置weblogic.xml
<session-descriptor>
<session-param>
<param-name>CookieName</param-name>
<param-value>JSESSIONID1</param-value>
</session-param>
</session-descriptor>
即将第一个web app的session id标识改为jsessionid1,同理将第二个改为jsessionid2,我只是修改了我的服务器上的weblogic,而没有修改其他服务器的,以上问题得到解决了。
同样,这也解释了为什么在最开始的时候我发现jsessionid在Tomcat下不变,而在Weblogic上确改变了的问题。”
根据上面这段描述,我在我的web项目中增加weblogic.xml,但由于我的开发环境是weblogic11g(v10.3.5),上面的xml在web项目里校验不通过,与根据weblogic-web-app.xsd的描述,在项目中增加如下配置,到此weblogic下丢失session问题搞定:
web项目1 weblogic.xml:
<?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://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">
?<session-descriptor>
??<cookie-name>JSessionID1</cookie-name>
?</session-descriptor>
</weblogic-web-app>
web项目2 weblogic.xml:
<?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://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd">
?<session-descriptor>
??<cookie-name>JSessionID2</cookie-name>
?</session-descriptor>
</weblogic-web-app>