有两个系统 A B现在A系统的某页面加入window.open(B系统)。采用struts架构,如window.open(http://X.X.X.X:1234/sale/test.do?method=XX)弹出窗口进入B系统页面后,发现A系统的SESSION值全丢了。百思不得其解。从网上搜,说用P3P,但用了也没效果,特求救。谢谢。

解决方案 »

  1.   

    window.open相当于又开了个新窗口,又一次新会话怎么会是同一个session?
      

  2.   

    两个系统之间的话,SESSION比然是没有的,除非SESSION共享
      

  3.   

    建议你用2种方法!
    1.用div层打开~不用window.open
    你在网上搜下div仿window.open2.把你要的SESSION的值在你新打开的B系统中重新执行!重新得到SESSION
      

  4.   

    不同项目下的SESSION是不会共享的啊。
    不过你可以考虑用参数传递的方式,第一次先验证,验证后就A->B的SESSION都有效了。
    如在A系统登录后到B系统:http://X.X.X.X:1234/sale/test.do?method=XX&username=test&pass=0029898
    当前pass传递的可以是加密过的密文这样安全一点。
    在B系统test.do进行验证后保存到SESSION中就可以了。
      

  5.   

    不是window.open的问题,不同项目下的session是不会共享的。
    如果信息简单,可以用参数传递;如果比较复杂,可以借助第三方工具,如数据库等
      

  6.   

    呵呵!session的存活周期是当前会话,及当前浏览器。当你用window.open(http://X.X.X.X:1234/sale/test.do?method=XX) 访问b系统里的页面的时候应该会新开一个浏览器吧!
    即打开了一个新的会话,a系统session里的值当然会丢失啊!
    你可以考虑将另一个链接进来哦!即保证在同一个浏览器里。
      

  7.   

    那是新开了个窗口,当然session会没有了,从一个窗口跳转到另一个窗口就能把session带过去了
      

  8.   

    谢谢各位,这边问题是我不需要SESSION共享,B系统的页面弹出后,我再关掉,回到A页面。A系统的SESSION丢失了。
    不知道怎么解决
      

  9.   

    可以考虑一下用frame,用frame,同时在头部加入p3p信息的话,可能会有效果
      

  10.   

    楼主参考一下,这是我以前的一个博客中的内容七、跨应用程序的session共享 常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互不干扰,要求每个小项目作为一个单独的web应用程序开发,可是到了最后突然发现某几个小项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on),在session中保存login的用户信息,最自然的要求是应用程序间能够访问彼此的session。 

    然而按照Servlet规范,session的作用范围应该仅仅限于当前应用程序下,不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范,但是实现的细节却可能各有不同,因此解决跨应用程序session共享的方法也各不相同。 
    首先来看一下Tomcat是如何实现web应用程序之间session的隔离的,从 Tomcat设置的cookie路径来看,它对不同的应用程序设置的cookie路径是不同的,这样不同的应用程序所用的session id是不同的,因此即使在同一个浏览器窗口里访问不同的应用程序,发送给服务器的session id也可以是不同的。 
    根据这个特性,我们可以推测Tomcat中session的内存结构大致如下。 
    笔者以前用过的iPlanet也采用的是同样的方式,估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器,解决的思路很简单,实际实行起来也不难。要么让所有的应用程序共享一个session id,要么让应用程序能够获得其他应用程序的session id。 iPlanet中有一种很简单的方法来实现共享一个session id,那就是把各个应用程序的cookie路径都设为/(实际上应该是/NASApp,对于应用程序来讲它的作用相当于根)。 <session-info><path>/NASApp</path></session-info> 
    需要注意的是,操作共享的session应该遵循一些编程约定,比如在session attribute名字的前面加上应用程序的前缀,使得 setAttribute("name", "neo")变成setAttribute("app1.name", "neo"),以防止命名空间冲突,导致互相覆盖。 在Tomcat中则没有这么方便的选择。在Tomcat版本3上,我们还可以有一些手段来共享session。对于版本4以上的Tomcat,目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文件、数据库、JMS或者客户端cookie,URL参数或者隐藏字段等手段。 我们再看一下Weblogic Server是如何处理session的。 从截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/,这是不是意味着在Weblogic Server中默认的就可以共享session了呢?然而一个小实验即可证明即使不同的应用程序使用的是同一个session,各个应用程序仍然只能访问自己所设置的那些属性。这说明Weblogic Server中的session的内存结构可能如下 
    对于这样一种结构,在 session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量,比如使用文件、数据库、JMS或者客户端 cookie,URL参数或者隐藏字段等手段,还有一种较为方便的做法,就是把一个应用程序的session放到ServletContext中,这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下, 应用程序A context.setAttribute("appA", session); 
    应用程序B contextA = context.getContext("/appA");HttpSession sessionA = (HttpSession)contextA.getAttribute("appA"); 
    值得注意的是这种用法不可移植,因为根据ServletContext的JavaDoc,应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通过。 那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢?原来是为了SSO,凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点,修改首先登录的那个应用程序的描述符weblogic.xml,把cookie路径修改为/appA 访问另外一个应用程序会重新要求登录,即使是反过来,先访问cookie路径为/的应用程序,再访问修改过路径的这个,虽然不再提示登录,但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM,因为浏览器和web服务器对basic认证方式有其他的处理方式,第二次请求的认证不是通过 session来实现的。具体请参看[7] secion 14.8 Authorization,你可以修改所附的示例程序来做这些试验。 
      

  11.   

    http://blog.csdn.net/yinyuan1987/archive/2008/11/17/3321213.aspx你要是要参考这篇博客,可以去看一下这个路径:
    http://blog.csdn.net/yinyuan1987/archive/2008/11/17/3321213.aspx
      

  12.   

    这种情况只能将sessionid保存起来,当程序返回到a时再取出来,没什么好办法
      

  13.   

    重新取个SESSION 要做这个你可以用楼上兄弟所说用DIV很方便
      

  14.   

    现在A系统的某页面加入window.open(B系统)。采用struts架构,如window.open(http://X.X.X.X:1234/sale/test.do?method=XX) 
    你也可以在window.open(http://X.X.X.X:1234/sale/test.do?method=XX&action=<%session.getAttribute("id")%>) 
    通过URL也可以进行再次传递
      

  15.   

    MARK
    window.open是打开一个新的应用,而session在不同应用中是不被共享的,所以他无法为你传值。就知道这些!学习
      

  16.   

    注意session有的范围哦
    如果是window.open的话,我想用application会好点
      

  17.   

    系统之间 session当然无效。
      

  18.   

    问题解决了,谢谢各位!通过在weblogic.xml中进行如下设置后,问题解决。(其中cookeiname的value值可以自行设置,区别于默认值既可)
    <session-descriptor>
     <session-param>
     <param-name>CookieName</param-name>
     <param-value>TS</param-value>
     </session-param>
     </session-descriptor>
        
    【问题分析】
    同一个Server ServerName = Server01,同一个Weblogic,分别建立两个Domain,Domain01(port-8018)和Domain02(port-8008),将应用App1部署在Domain01,将应用App2部署在Domain02,同时启动这两个Domain,如果完全是默认配置,单独访问两个应用是没有问题的,但是在同一个客户端如果访问App1之后再访问APP2会发现App1的Session丢失。
    客户端在访问App1时,Domain01会在该客户端保留一个名为 JSessionID的Cookie,记录了Domain01的信息,JSessionID为Weblogic cookie-name的默认值,当同一个客户端访问App2时,该客户端Cookie中JSessionID的值被Domain02刷新,此时如果在之前已经打开的IE中继续访问App1会发现Session丢失(JSessionID已经被Domain02刷新!)。