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


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

     

    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 ")

  • 相关阅读:
    Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin[id:xxx.xxx.xxx]
    Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':classpath'.
    react native 使用typescript
    electron 关于jquery不可以用
    css 你真的了解padding吗?
    css padding-right没有用?
    部署iis7和vs2010低版本项目遇到的一些问题
    html 渲染原理
    webpack 打包jquery
    Java——运算符那些事
  • 原文地址:https://www.cnblogs.com/bribe/p/3788684.html
Copyright © 2020-2023  润新知