原本去年在做项目时,写好的一记篇博客分享给大家。

 

Asp.net页面跳转Session丢失问题

 

编写人:CC阿爸

 

2014-4-2

 

l  近来在做泛微OA与公司自行开发的系统集成登录的问题。在使用Response.redirect跳转时,Session变量会丢失的问题。

 

经过在网上搜索部分解决方案,大致可以归类为以下几种情况

  1. 是因为iis回收的原因。有人建议更改session存储模式

改变session的存储介质,默认为Inproc,还有另外两种方式,StateServer和SQLServer。

这里把mode改为StateServer,默认的inproc虽然方便好用,但是非常容易出现session丢失的问题,

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20" stateNetworkTimeout="10"/>

 

  1. IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)协议默认阻止第三方无隐私安全声明的cookie,Firefox目前还不支持P3P安全特性,firefox中自然也不存 在此问题了。Mircosoft对此的具体描述可以参见 Privacy in Internet Explorer 6 

解决办法是在服务器响应时输出P3P的主机头声明:

if (context.Request.Browser.Browser.ToUpper().Contains("IE"))

        context.Response.Headers.Add("P3P", "CP=CAO PSA OUR");

 

  1. 当页面中是否了frameset,发现在每个frame中显示页面的SessionID在第一次请求时都不相同,原因是你的frameset是放在一个htm页面上而不是ASPX页面。
     在一般情况下,如果frameset是aspx页面,当你请求页面时,它首先将请求发送到Web服务器,此时已经获得了SessionID,接着浏览器会分别请求Frame中的其他页面,这样所有页面的SessionID就是一样的,就是FrameSet页面的SessionID。
     然而如果你使用Html页面做FrameSet页面,第一个请求将是HTML页面,当该页面从服务器上返回是并没有任何Session产生,接着浏览器会请求Frame里面的页面,这样这些页面都会产生自己的SessionID,所以在这种情况下就会出现这种问题。当你重新刷新页面时,SessionID就会一样,并且是最后一个请求页面的SessionID。

 

综上发现,我使用的是第三种,因此常会出现session丢失的问题,使用第一二种解决方法未能解决。

于是仔细观察了httpwatch中截获的请求,发现Cookies选项中在跳转之前是空的,这个里面应该存储了当前session的id才对,于是就想如果我在Redirect之前就将session的id放到Cookies中是不是就能解决这个问题了呢。果然不出所料,修改完后问题解决了。 

Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", Session.SessionID));

 

Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", Session.SessionID)); 

Response.Redirect("index.htm",false);

后来想到,这个问题还有一个比较简单的解决办法就是: 

 Server.Transfer("index.htm ")

 

posted on 2014-06-14 20:59  左丘文  阅读(3116)  评论(0编辑  收藏  举报