iframe中的session失效问题情况描述和解决

 
 
环境描述: A 平台 ( 域名 :www.aaa.com) B 平台 (zengzhi.bbb.net) A 平台的一个页面 a.jsp 嵌套 B 平台的一个页面 b.jsp A 使用 iframe , b.jsp 上引用了 B 平台另外一个 image.jsp image.jsp 生成一个随机验证码,存入 session ,生成一个图片,显示在 b.jsp 上。提交 b.jsp ,到 B 平台的 Baction.do, 发现在 Baction 中取道的 session 为空。
 
 
如果 a.jsp B 平台应用上,不会出现上述问题。在这种应用中,页面中的 session 失效了。
 
网上资料:
其实之所以出现这种情况是我们一般采用 IE6 作为浏览器( IE7 firefox 没有这个问题),而 IE6 它的安全策略默认是会把 iframe 中的页面站点认为是不可信任的,它会阻止该站点传过来的 cookie (如果你在 iframe 中的 URL 跳转是用的 localhost, 则不会被阻挡),所以因为没法使用 cookie 了, session 便实效了。其实这里还是有个小问题的,因为在 j2ee 中的 session 是靠 cookie url 重写来维持的,如果 cookie 不能用了,因该是自动采用 url 重写来维持住 session ,不知为什么没有自动采用后者。
 
 
解决方法一:
      一个是在 IE 中设置允许 iframe 中的站点的 cookie ,在工具 - Internet 选项 - 〉安全 - 〉受信任的站点,将 zengzhi.inhe.net ,设置为‘受信任的站点’,这样,在 Baction 就可以取得 session 中的值了,但有一个问题,就是每次访问 a.jsp 的时候, IE 总会提示‘是否允许该站点’,感觉很烦,为了顺利访问 a.jsp ,我们还需要将 www.aaa.com 设置为‘受信任的站点’,这样就可以彻底解决 session 失效问题。
 
       虽然这种方法可以解决 session 失效问题,但每个用户都要设置 IE ,这样非常麻烦,也没有从根本上解决 session 失效问题。
 
解决方法二:
       a.jsp 连接 b.jsp 时,生成了一个 session b.jsp 引用了 image.jsp ,我们发现 imgae.jsp 中的 session 又是一个新的,和 b.jsp 中并不是同一个 session ,在提交 b.jsp 后, Baction 也生成一个新的 session ,这三个 session sessionId 是不同的。由此可以知道在 jsp 向下传的过程中 sessionId 丢失了。为了保持同一个 session ,在地址跳转时,将 sessionId 带上,这样,在下一个页面或 action 中,会取到相同的 session
引用 image.jsp 写法:
<img src="<%=request.getContextPath()%>/webadmin/js/imagecode2.jsp;jsessionid=<%= session.getId()%>" name=Image1 border=0 >
 
提交地址写法:
action="<%=request.getContextPath()%>/webadmin/userselfservice/login/login.do;jsessionid=<%=session.getId()%>"
 
这样到了 Baction 中,取得的是同一个 session, 就可以取得随机验证码 .
 
 
别以为这样就成功了,还存在一个巨大的陷阱。虽然我们从 A 平台将 session 值传递到了 B 平台,发现在 Baction , 添加的新的 session 属性(如:用户信息),在 Baction 之后, B 平台其他的页面,居然取不到。这是为何??难道还需要继续传递 sessionId 不成?的确如此,在以后的页面我们还需要继续传递 sessionId 。。。。如此下去,系统将混乱不堪。所以我们不能让 sessionId 这样牵制着我们,我们要消灭它。不错,在 Baction 之前,我们不得不使用同一个 session, 但到了 B 平台操作后,我们将和他断绝关系,这样我们才能自由。在我们进入 Baction 后将我们需要的 session 中的值取出,然后销毁它,再创建一个新的 session
request.getSession().invalidate();
HttpSession newSession = request.getSession(true);
我们将需要的值,设置到 newSession 中即可。
 
 
比较起来还是使用方法二来解决,这可能是 session 问题的一种,还存在类似的 session 失效问题,可以根据方法二和具体环境进行改进。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值