zoukankan      html  css  js  c++  java
  • 一个页面两个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的配置和编译后的文件。)

  • 相关阅读:
    2013-9-29 通信原理学习笔记
    《大数据时代》阅读笔记
    《人人都是产品经理》阅读笔记一
    2013-8-13 信道接入技术研究学习
    2013-8-6 ubuntu基本操作
    2013-7-30 802.1X企业级加密
    2013-7-29 杂记
    2013-7-28 802.11n帧聚合
    2013-7-27 802.1X学习
    vue+node+mongoDB前后端分离个人博客(入门向)
  • 原文地址:https://www.cnblogs.com/noam/p/1688443.html
Copyright © 2011-2022 走看看