showModalDialog中打开新页面Session丢失

lingdu_hua 2008-11-21 09:24:30
我在showModalDialog中打开一个超链接,target="_blank"
在新弹出的页面中会发生Session丢失的现象,我监测SessionID发现新页面中SessionID和父页面不一致了.说明新窗口中又重新建了一个回话.另外,这种现象不是每次都有,但是偶尔会发生.
但是我在Web.config中配置了如果SESSION为空就会跳到登录页.所以我在点开这个超链接的时候会打开一个登陆页-_-!
请教高人指点一下怎么改,谢谢了.
PS:网上有一种在打开模态对话框时将父页的window作为参数传递进来,然后通过dialogWindowArgs.open弹出新界面的方法,但是我们公司大多数人(特别是领导)的IE7都设置成了"遇到新窗口时直接在新选项卡中打开",所以如果是超链接设置为target="_blank"时会弹出新页面;而以window.open方式打开的话会以新选项卡方式打开,就必须先关闭模态对话框才能点开那个新选项卡-_-!项目是给公司自己用的OA,所以要照顾大多数人(特别是领导)的习惯...
...全文
1685 42 打赏 收藏 举报
写回复
42 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jjrolddog 2010-11-11
mark
  • 打赏
  • 举报
回复
afahvbvb 2008-12-17
mark
  • 打赏
  • 举报
回复
lingdu_hua 2008-11-21
我发现加了那句话以后就会将登录的信息记录到cookie里了吧?
也就是原始的Form验证+cookie的机制了.
  • 打赏
  • 举报
回复
lovehongyun 2008-11-21
非感谢您!我不是用Session传东西,只是因为Form验证的原因导致一丢Session就跳登陆页.很让人头疼.
因为这个问题不是每次都出现的,所以我需要反复登录然后测试一下,如果没有问题的话下午就结帖~
============
把这个改成true就好了.
FormsAuthentication.RedirectFromLoginPage(userName, true);

第二个参数的意思是
若要创建持久 Cookie(跨浏览器会话保存的 Cookie),则为 true;否则为 false。

如果你不是持久cookie,那么cookie是基于浏览器进程的.所以你"_blank"新开页面会跳到登录页面.把RedirectFromLoginPage方法的第二个参数改为true可解决这个问题

  • 打赏
  • 举报
回复
lingdu_hua 2008-11-21
[Quote=引用 29 楼 lovehongyun 的回复:]
那这句还用写吗?
项目是用的MemberShip,我不知道里面写没写您那两句话,如果我在登录页写了会对项目造成影响么?

MemberShip应该也会有FormsAuthentication.RedirectFromLoginPage这样的语句.你查一下你的项目里,应该有的
那个语句你要是传就写吧.

你用的forms验证,直接HttpContext.Current.User.Identity.Name就能取到用户的.
[/Quote]

非感谢您!我不是用Session传东西,只是因为Form验证的原因导致一丢Session就跳登陆页.很让人头疼.
因为这个问题不是每次都出现的,所以我需要反复登录然后测试一下,如果没有问题的话下午就结帖~
  • 打赏
  • 举报
回复
lovehongyun 2008-11-21
那这句还用写吗?
项目是用的MemberShip,我不知道里面写没写您那两句话,如果我在登录页写了会对项目造成影响么?

MemberShip应该也会有FormsAuthentication.RedirectFromLoginPage这样的语句.你查一下你的项目里,应该有的
那个语句你要是传就写吧.

你用的forms验证,直接HttpContext.Current.User.Identity.Name就能取到用户的.
  • 打赏
  • 举报
回复
lingdu_hua 2008-11-21

hl.NavigateUrl = "DEV_form.aspx?InstanceID="+GVW_Dev.DataKeys[e.Row.RowIndex].Value.ToString()+
"&PackageID=" + ((DataRowView)e.Row.DataItem)["PackageID"].ToString() +
"¤tStep=DisplayMode&Session="+GetCurrentLoginUserName();


那这句还用写吗?
项目是用的MemberShip,我不知道里面写没写您那两句话,如果我在登录页写了会对项目造成影响么?
  • 打赏
  • 举报
回复
qinhl99 2008-11-21
net下导致Session失效的一种情况:js教本中使用window.open和window.showModalDialog时需要注意
在项目中碰到过一种情况先用window.open打开1.aspx,1.aspx中用window.showModalDialog打开2.aspx,2.aspx中用window.open打开3.aspx,那么在3.aspx中取不到Session中的值。
于是我先做了一个default.aspx页面,向Session中存入值,在后面的三个页面中,分别去取Session中的值。三个页面的打开方式不一样,共6钟情况,测试结果如下:

打开顺序
第一个页面
第二个页面
第三个页面

open/open/open
Y
Y
Y

modal/modal/modal
Y
Y
Y

open/modal/open
Y
Y
N
modal/open/modal
Y
N N
Open/modal/modal
Y
Y
Y

Modal/open/open
Y
N N

Open/modal/open指页面1,2,3的打开方式,用open打开页面1,页面1用modal打开页面2,页面2用open打开页面3。

“Y”表示可以取到Session中存入的值;“N”表示不能取到Session中存入的值。

测试环境win2000,ie6.0+sp1,多数情况下会出现;win2003,ie6.0+sp2,总是出现。

modal打开页面后,在打开的页面再open打开新页面时,在新开的页面总会出现Session丢失的问题,所以,在脚本中使用window.showModalDialog打开页面后慎用window.open打开页面,会导致Session取不到。大家可以测试一下。

深入考虑,是不是modal打开的页面再用open打开另一个页面时,ie认为这是新开了一个线程?总而言之,这是ie的一个bug吧。
  • 打赏
  • 举报
回复
lovehongyun 2008-11-21
不好意思,又试了一下.只要改这一个就行了.另一个语句不用改,如果你不想存永久cookie的话
FormsAuthentication.RedirectFromLoginPage(userName, true);


这个改语第二个参数改成true后,就再链到那个新页面就不会反回登录界面了.
  • 打赏
  • 举报
回复
lovehongyun 2008-11-21
把你登录里边这两行代码都改成true,我测试了一下.可以了.
FormsAuthentication.SetAuthCookie(userName, true);
FormsAuthentication.RedirectFromLoginPage(userName, true);
  • 打赏
  • 举报
回复
lovehongyun 2008-11-21
[Quote=引用 22 楼 lingdu_hua 的回复:]
自己继续顶
求解决方案
[/Quote]

哦.用的forms验证啊.
登录的时候把 FormsAuthentication.SetAuthCookie(userName, true);第二个参数改成true
  • 打赏
  • 举报
回复
yagebu1983 2008-11-21
传参数!!
  • 打赏
  • 举报
回复
lingdu_hua 2008-11-21
自己继续顶
求解决方案
  • 打赏
  • 举报
回复
fenyuxiao 2008-11-21
这种情况我也遇到过了,后来实在没找到方法,就直接传参数过去,虽然解决了,但不知道有什么更好的办法,期待中!
  • 打赏
  • 举报
回复
lingdu_hua 2008-11-21
[Quote=引用 19 楼 lovehongyun 的回复:]
应该对吧.你看一下url上对吗.url对就是对了.
先把你DEV_form.aspx页中对session判断为null就跳到登录页面的语句注释了看一下url
[/Quote]
我没有判断SESSION为空啊.这个功能是在Web.Config里:

<!--下面的配置将指定ASP.NET使用FormsAuthenticationModule类-->
<authentication mode="Forms">
<forms loginUrl="Login.aspx" protection="All"/>
</authentication>
<!--站点所有页面都拒绝所有匿名用户-->
<authorization>
<deny users="?"/>
</authorization>
  • 打赏
  • 举报
回复
lovehongyun 2008-11-21
应该对吧.你看一下url上对吗.url对就是对了.
先把你DEV_form.aspx页中对session判断为null就跳到登录页面的语句注释了看一下url
  • 打赏
  • 举报
回复
lingdu_hua 2008-11-21

HyperLink hl = (HyperLink)e.Row.FindControl("hlTitle");
hl.NavigateUrl = "DEV_form.aspx?InstanceID="+GVW_Dev.DataKeys[e.Row.RowIndex].Value.ToString()+
"&PackageID=" + ((DataRowView)e.Row.DataItem)["PackageID"].ToString() +
"¤tStep=DisplayMode&Session="+GetCurrentLoginUserName();


那我按您说的是这么写的,对吗?
Session还是会丢
  • 打赏
  • 举报
回复
lovehongyun 2008-11-21
[Quote=引用 14 楼 lingdu_hua 的回复:]
引用 13 楼 lovehongyun 的回复:
如果你用 "_blank", session肯定会是新的session的.
你要非这样做就用url传参过去.

我是这样写的,您看下对不对?

C# code
HyperLink hl = (HyperLink)e.Row.FindControl("hlTitle");
hl.NavigateUrl = "DEV_form.aspx?InstanceID="+GVW_Dev.DataKeys[e.Row.RowIndex].Value.ToString()+
"&PackageID=" + ((DataRowView)e.Row.DataItem)["PackageID"]…
[/Quote]

传过去后要用Request[""]去取.
session的值传过去了.但是新开页面的session还是新的.
  • 打赏
  • 举报
回复
lovehongyun 2008-11-21
[Quote=引用 15 楼 lingdu_hua 的回复:]
有个朋友告诉我用这种方式

C# code
hl.NavigateUrl = "DEV_form.aspx?InstanceID="+GVW_Dev.DataKeys[e.Row.RowIndex].Value.ToString()+
"&PackageID=" + ((DataRowView)e.Row.DataItem)["PackageID"].ToString() +
"¤tStep=DisplayMode&ASP.NET_SessionID="+Session.SessionID;



但也不行,跳转到登陆页面后,SessionID和我父页的SessionID是相同的,这说明Session没有对啊,但…
[/Quote]
你传sessionid有什么用?
如果你要跳转到的那个页面对session做了验证.比如说判断session是否为null,为null就跳到登录页.如果你做了这样的判断那肯定会跳到登录页的.因为你"_blank"后弹出的页面是个新页面.session也是新的.
  • 打赏
  • 举报
回复
lingdu_hua 2008-11-21
有个朋友告诉我用这种方式

hl.NavigateUrl = "DEV_form.aspx?InstanceID="+GVW_Dev.DataKeys[e.Row.RowIndex].Value.ToString()+
"&PackageID=" + ((DataRowView)e.Row.DataItem)["PackageID"].ToString() +
"¤tStep=DisplayMode&ASP.NET_SessionID="+Session.SessionID;

但也不行,跳转到登陆页面后,SessionID和我父页的SessionID是相同的,这说明Session没有对啊,但为什么会跳到登录页呢...想不通.
  • 打赏
  • 举报
回复
加载更多回复
发帖
.NET社区
加入

6.0w+

社区成员

.NET技术交流专区
社区管理员
  • ASP.NET
  • R小R
  • 喵叔哟
帖子事件
创建了帖子
2008-11-21 09:24
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。