以前在做ASP.NET开发时一直没注意到一个问题,就是广泛使用的Response.Redirect方法并不会将服务器端在Response中新增或修改的Cookie返回给客户端浏览器,而网站的Session一般来说又是通过Cookie来做客户端唯一标识的,这就会使得当浏览器第一次通过Get方法发送请求到服务器后(由于是客户端浏览器第一次访问服务器,所以这时客户端浏览器中还没有Cookie存储SessionID),在服务器返回的响应中得不到带有SessionID的Cookie,使得浏览器在下一次发送请求给服务器端时,在请求中还是读不到带有SessionID的Cookie,服务器端又会再创建一个新的Session,导致第一次请求在服务器上创建的Session丢失。注意导致这个问题的前提条件:浏览器第一次发送请求到服务器端,服务器端使用了Response.Redirect方法,使得生成的带有SessionID的Cookie不会发送回客户端浏览器。

示例代码,浏览器发送第一次请求到xxx.aspx中设置Session值,然后跳转到页面yyy.aspx后,yyy.aspx中读不到xxx.aspx中设置的Session值,并且在Request.Cookies中生成了一个和xxx.aspx不同的SessionID.

Session["xxx"] = xxx;
Response.Redirect("yyy.aspx");

这就是因为xxx.aspx中的Response.Redirect没有将生成的SessionID通过Cookie传回浏览器,使得浏览器在发送请求到yyy.aspx时,服务器端检测不到带SessionID的Cookie,生成了新的Session启动了新会话,那么自然也就得不到在xxx.aspx中设置的Session值了。

解决方案:

在浏览器还没有得到服务器端生成的SessionID前,服务器端尽量不要使用Response.Redirect方法做跳转,而是用替代方案做客户端URL地址跳转,比如通过Javascript来设置浏览器的window.location属性。这样当浏览器获得第一个请求的服务器端响应时,就能得到带SessionID的Cookie了,从而在后续请求中将这个带SessionID的Cookie发送回服务器端,使会话延续。

在最新版本的ASP.NET测试发现本文所述的问题已经不存在了,Cookie在Response.Redirect后已经可以成功发送到客户端浏览器,并被Redirect之后的服务器页面读取到。看到一篇老外写的文章也提到ASP.NET的一个BUG修复补丁修复了Redirect会丢失Cookie的问题,所以本文所述内容在最新版本的ASP.NET中已不存在,如果在老版本的ASP.NET中遇到本文所述的问题,可以参考上面内容。

ASP.NET Response.Redirect 丢失 Session的问题(作废,仅供参考)的更多相关文章

  1. Asp.net Response.Redirect with post data

    string url = String.Format("{0}://{1}/{2}", Request.Url.Scheme, Request.Url.Authority, &qu ...

  2. response.redirect 与location.href 的区别

    最近做项目时发现,先弹出提示框,再跳转页面 这样写:Jscript.Alert("你好,Hello!"); Response.Redirect("/index.aspx& ...

  3. aspx在页面跳转(Response.Redirect)时丢失session问题及解决办法

    [问题描述] 假设a.aspx.cs页面保存有Session["empid"]="3",当a.aspx.cs通过Response.Redirect(" ...

  4. Response.Redirect("x.aspx);跳转后session为null的解决方法

    通常我们做登陆的时候都是登录成功后为管理员保存一些信息,一般都会写类似下面的代码 if(登录成功) { Session["xx"] = "user"; Resp ...

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

    原本去年在做项目时,写好的一记篇博客分享给大家. Asp.net页面跳转Session丢失问题   编写人:CC阿爸 2014-4-2 l  近来在做泛微OA与公司自行开发的系统集成登录的问题.在使用 ...

  6. Session variables lost after the call of Response.Redirect method

    From:  https://forums.asp.net/t/2096848.aspx?Session+variables+lost+after+the+call+of+Response+Redir ...

  7. ASP.NET 状态服务 及 session丢失问题解决方案总结

    ASP.NET2.0系统时,在程序中做删除或创建文件操作时,出现session丢失问题.采用了如下方法:1.asp.net Session的实现:asp.net的Session是基于HttpModul ...

  8. 如何解决Response.Redirect方法传递汉字丢失或乱码问题?

    为了确保传递的汉字被正确地接收,可以在传值之前使用Server对象的UrlEncode方法对所传递的汉字进行URL编码.代码如下: String name = Server.UrlEncode(&qu ...

  9. [转]ASP.NET 状态服务 及 session丢失问题解决方案总结

    转自[http://blog.csdn.net/high_mount/archive/2007/05/09/1601854.aspx] 最近在开发一ASP.NET2.0系统时,在程序中做删除或创建文件 ...

随机推荐

  1. Mobileye众包地图REM的一些整理

    Mobileye的CEO Shashua在CVPR2016上介绍了Road Experience Management(REM),目前仍是视觉高精度地图和定位的(几乎)唯一的解决方案.这两年间,mob ...

  2. flume使用场景 flume与kafka的比较

    Is Flume a good fit for your problem? If you need to ingest textual log data into Hadoop/HDFS then F ...

  3. PHP多进程编之pcntl_fork

    其实PHP是支持并发的,只是平时很少使用而已.平时使用最多的应该是使用PHP-FMP调度php进程了吧. 但是,PHP的使用并不局限于做Web,我们完全也可以使用PHP来进行系统工具类的编程,做监控或 ...

  4. 【mongoDB运维篇③】replication set复制集

    介绍 replicattion set 多台服务器维护相同的数据副本,提高服务器的可用性,总结下来有以下好处: 数据备份与恢复 读写分离 MongoDB 复制集的结构以及基本概念 正如上图所示,Mon ...

  5. cookie 组成结构

    1.用抓包工具 fidller 只能看到 cookie 的 name 和 value 两个参数,实际上 cookie 还有其 它参数 2.以下是一个完整的 cookie 组成结构 cookie ={u ...

  6. AD域创建用户无法登录

    怎么登录都无法登录 解决办法: 创建用户的时候   将用户下次登录时须更改密码的勾去掉    不然需要修改密码才可以登录

  7. Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

  8. oracle数据库中如何去除空格

    目前,我所知道的就有两种方法: 一.trim(a)--只能去除字符串左右的空格 select trim(leading from ' ——11—— ') aa from dual; select tr ...

  9. IIS 安全设置

    这近网站中毒,以下把IIS安全设置记录一下,以便查阅. 1.对于不需要执行的目录,将处理程序映射中的编辑功能权限中的脚本去掉,这样即使上传了木马文件在此目录,也是无法执行的. 删除IIS默认的匿名用户 ...

  10. October 15th 2017 Week 42nd Sunday

    Excellence is a continuous process and not an accident. 卓越是一个持续的过程而不是一个偶然事件. It is said that ten tho ...