一个页面两个session的问题分析

本例为一个特例。

 

背景:

Linux服务器,Apache+tomcat。Java Web工程文件放在webapps路径下。由于除了java工程外还有别的几个Web项目,使用Apache作为http服务器。Java工程采用SSH架构,用到extjs,flex等。

将某域名和Java工程目录绑定。 

有时会出现Flex页面无法获得session中数据的问题,而无论是开发调试过程中还是其它Windows服务器上均没有出现该问题。

 

排查: 

考虑到也许存在路径设置问题引起Windows和Linux下的不同。对于java代码的排查进行了一天,包括Session变量赋值,重置和取出,包括所有路径设置,没有发现任何问题。 使用HttpFox对页面Http信息进行抓取,发现在进入Flex页面时会得到两个jsessionid,被取的session不是原有session,自然不能获得session数据。

在另一台Linux机器上就安装tomcat,采用默认设置,没有任何问题,排除上面一条的猜测 。问题必然出现在Linux服务器上,并且应该是Http或Web服务器配置问题。

停掉Apache,直接使用tomcat的Web配置(注:此时的配置并没有将域名和webapps下的工程路径绑定,但当时还没有注意到这个问题),使用IP+路径名的方式访问Web页面。Flex页面变为只有一个session。

重新启用Apache,不进行域名绑定IP,一个session。

仅用域名绑定IP, 一个session;域名绑定IP+路径名,连个session!

到此,终于定位到连个session的配置条件,可是为什么会这样呢?

 

此前,出现过这样的问题:即更改项目名称,则Flex页面不能正常进行数据通信。简单地进行源代码全文 查找,没有发现任何硬编码。此次再次尝试,发现仍然是这个问题,可是源文件里没有硬编码又是怎么回事呢?

 经过排查,发现进行数据通信的配置文件services-config.xml中,有设置路径context.root:

代码
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            
<endpoint url="http://{server.name}:{server.port}/{context.root}/spring/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        
</channel-definition>

 

而该路径又是在FlexBuilder的配置中设的,其命令为:

-services "services-config.xml" -context-root "HelloBlazeds" 

由于此前编译时context.root为一个固定的字符串,此后一直使用编译所得二进制文件。所以,当服务器使用域名绑定webapps下的项目名时,即——若访问URL中可以不需要加入项目路径名时,Flex执行时会因此多生成一个session,与之前session不同,于是原session中的数据无法被取到。

 

解决方案: 

去掉路径context.root,重编译Flex文件。若设置URL不需要加入项目名称时,使用这一套编译后的Flex二进制文件。(此方案目前暂时没有测试,本次更改为备份原以Skyeye为context.root的配置和编译后的文件。)

posted on 2010-03-17 19:16  南淮茶座的掌柜  阅读(6225)  评论(1编辑  收藏  举报

导航