您的位置:首页 > 其它

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

2010-03-17 19:16 363 查看
本例为一个特例。

背景:

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的配置和编译后的文件。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐