今天遇到一个问题,我们程序因为某种原因后台管理与显示界面是分开的。
于是在一台主机中架了两个tomcat,现在后台管理需要加一个预览按钮,于是用window.open打开显示相关界面
也就是说http://192.168.0.200:8080中有一个网页用window.open打开http://192.168.0.200:8081的一个界面。
会出现session丢失的情况,(父窗口的session会丢失)。
当我把外网移动到另一台服务器上比如http://192.168.0.159:8081(ip不同),就不会出现问题。
哪位大哥知道是怎么回事啊?小弟现在这谢谢了
我的环境:Tomcat5.5,jdk1.5,windows 2000 server,ie6.0
[b]问题补充:[/b]
不是共享session是[b]父窗口[/b]session丢失,window.open打开的新窗口不需要session
还有链接党就不要在这混了。分不会给你们的
[b]问题补充:[/b]
我试过用target blank方法,还是会丢失session。个人认为是不是因为ip相同,所以session值发生序乱导致的?
[b]问题补充:[/b]
Ihavegotyou
在tomcat下cookie冲突好像没法子解决啊
[b]问题补充:[/b]
我的ie版本为IE6.0测试IE7也不可用
因为sessionid 在客户端是存储在cookie中的
cookie 用 域 来控制对cookie的访问
和端口无关
当你用以个ip来访问不同端口的时候
实际域是相同的 也就是说
http://192.168.0.200:8080 http://192.168.0.200:8081
域是一样的
所以你在预览的时候 session 被覆盖成http://192.168.0.200:8081的session
原来的http://192.168.0.200:8080 session 也就消失了
当你用不同的ip地址访问时 域分别为 192.168.0.200 和192.168.0.159
cookie 分别为这两个域建立了sessionid 而 sessionid 是用来标示session的
所有就正常
当你用域名访问时,分别用两个二级域名, 比如 admin.xxxxx.com www.xxxxx.com
如果用ip 可以分别用两个ip来提供服务
如果是单机 可以一个用回路 比如 127.0.0.1 一个用你的局域网地址 比如192.168.0.200
两个处于不同应用页面能共享session?
集群吗?
再打开新窗口时,父窗口不能关闭,若父窗口关闭,则sessionId丢失。所以下一次访问便为空。
参考下这个
http://blog.joycode.com/ghj/archive/2004/06/23/25521.joy
不会啊
莫非是lz的服务器会话时间设置得太短了?
window open session 丢失时不时发生, 这和浏览器有关系
建议可以用别的方式实现,比如iframe弹出层之类,target blank
Session与cookie有基大 的关系, 看看是否是cookie的冲突。
基于browser来说,ip + cookie 基本上就构成了一个session
IE8就会发生 IE7以下貌似没有 我们也遇到这种情况
为什么不发布两个不同的应用http://192.168.0.200/a, http://192.168.0.200/b而选择不同的port?
window.open确实会丢失session,这个是不用怀疑的,尽管不是必然的。
其实不仅仅是丢失Session的问题,Authentication (用户验证信息)也会丢失。
这个问题出现的原因是因为 :
"Browse In New Process." 某些情况下,你打开IE的一个新进程,这些信息没有被同步过去。
解决方法当然是老套的及时打补丁。
这是个概率问题,也是看运气的。微软有时也不可信。
当然也可以从编程上来解决这个问题:
WINDOW OPen 前.把当前页面的SESSION ID(COOKIE中) 取出,并附加到open的页面(以GET方式过去)
在Open页面接收GET过来的字串.并设置相关的COOKIE.再去调用SESSION.测试一下,看是否还丢.
当然会丢失session,这个毫无疑问,Authentication (用户验证信息)也会丢失。原因在于:你把两个不同的工程架设在两个不同的tomcat里面,访问的是两个不同的服务器,我们试想一下,在一个服务器里面两个不同的工程在没有做资源共享的情况下,能相互访问他们的内存区域吗?答案是否定的,既然这样,那么在不同的web服务器中当然也不能访问了,因此,用window.open(...)方法是会丢失session的,那么我们采用什么方式可以解决呢?把当前的session ID传递过去吗?可以,我们将当前的Session ID传递过去,然后创建一个新的Session,可是这个新的session里面却不存在原来session里面的数据了,因此,最终的解决办法是采用集群,session复制,这样的话,新的session就是原来session的一个副本
[color=olive][size=large]
如果是IE浏览器的另开一个窗口就会丢失掉Session, 因为你是重新请求一个连接了, 原来的session已经在服务器被删除.
"个人认为是不是因为ip相同,所以session值发生序乱导致的", 应该是不可能的, 毕竟是要保持着sessionID的唯一,你重新打开(window.open())就是新建一个进程,进程之间的数据不是共享的,线程才能共享数据(个人之见)
[/size][/color]
当用showmodaldialog打开一个窗口a,并传递session("id"),若在新窗口a中有一个提交的按钮,且转向另一个页b时,会造成session("id")丢失,原因是新打开的窗口b指针断裂,无法正确指向。
解决的办法是,设置一个中间窗口c,在c中放置一个iframe,这个iframe初始src指向a,当点击提交后,不弹出窗口,只是在c的iframe中完成提交,即iframe的src由a变为b,问题解决。
open一个blank的窗口,然后submit到上面.
我曾碰到和楼主一样的问题,解决方案如下:
通过在weblogic.xml中进行如下设置后,问题解决。(其中cookeiname的value值可以自行设置,区别于默认值既可)
CookieName
TS
【问题分析】
同一个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刷新!)。
两个地址的IP和端口都不同,对服务器来说这是2个不同的应用,session不能跨域,除非是做单点。