当前位置: 首页 > 图文教程 > 网络编程 > Javascript > cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失

Javascript
表格 隔行换色升级版
JavaScript 变量基础知识
fileupload控件 文件类型客户端验证实现代码
extjs DataReader、JsonReader、XmlReader的构造方法
让Firefox支持event对象实现代码
CSS+Js遮罩效果的TAB及焦点图片切换(推荐)
javascript showModalDialog传值与FireFox的window.open 父子窗口传值示例
JQuery 图片延迟加载并等比缩放插件
Jquery作者John Resig自己封装的javascript 常用函数
js 鼠标拖动对象 可让任何div实现拖动效果
页面中js执行顺序
Javascript select下拉框操作常用方法
jQuery 常见学习网站与参考书
javascript currying返回函数的函数
prototype 中文参数乱码解决方案
为javascript添加String.Format方法
asp.net HttpHandler实现图片防盗链
Riot.js 快速的JavaScript单元测试框架
Javascript实现的CSS代码高亮显示
Js 实现表格隔行换色一例

Javascript 中的 cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 350 ::
收藏到网摘: n/a

window.showModalDialog() 后 window.open() 导致cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失

不知大家是否遇到过如此的尴尬:

当你的页面认证采用基于Cookie的方式,例如form,windows集成认证时,如下操作后有时认证失效,Authentication (用户验证信息)丢失,需要再次登录
系统正常登录后:

第一个页面(PageA.htm):window.showModalDialog()后,弹出第二个页面(PageB.htm)

第二个页面(PageB.htm):window.open()后,弹出的窗口(PageC.htm)有时会跳转到登录页面

这应该是由于不同的页面存在于不同的进程,导致了身份信息不同步,发生了认证失效,然而这是有一定概率发生的,经过MS顾问的帮忙,终于找到了方法:
概括讲就是,在showModalDialog()时,将window作为对象参数传入PageB.htm,在PageB中,用这个参数去open(),这样问题就解决了
具体如下:
-----------PageA.htm--------------
...
var obj = new Object();
obj.myTestWindowA = window;//将这个window存入对象参数中
window.showModalDialog("PageB.htm",obj,"");
...
----------------------------------

-----------PageB.htm--------------
...
var obj = window.dialogArguments;//获取上个页面的参数
obj.myTestWindowA.open("PageC.htm");//用上个页面传过来的参数打开下一个页面
...
----------------------------------
经测试,没有再出现身份丢失现象,大功告成了!
细心的朋友会发现,这样的操作会导致,在PageC.htm中由于opener不是PageB.htm而是PageA.htm了,所以无法用window.opener与PageB.htm进行通信,而open()又无法传递对象参数,慌了!
不过幸好在javascript中,对象是一颗大树,你可以在它的枝杈上挂任何东西,所以,我们为了PageC.htm能与PageB.htm通信,对PageB.htm改造 如下:
-----------PageB.htm--------------
...
var obj = window.dialogArguments;//获取上个页面的参数
var obj.myTestWindowA.myTestWindowB = new Object();
obj.myTestWindowA.myTestWindowB = window;//将PageB的window挂在PageA的window枝干下
obj.myTestWindowA.open("PageC.htm");//用上个页面传过来的参数打开下一个页面
...
----------------------------------
如此,便可在PageC中,通过window.opener.myTestWindowB来与PageB页面的对象通信,例如 window.opener.myTestWindowB.document.getElementById("TextBox1").value="OK"

注:
1.这也许只是一种情况,可能先open再showModalDialog也有可能导致身份信息丢失,但大家只要传那个没有问题的window到下一页面,问题就能迎刃而解。

(丢失情况请参见http://www.ourac.net/read.php?tid=45123&fpage=2
2.也有可能在Session时发生,请参见http://support.microsoft.com/default.aspx?scid=kb;EN-US;196383