以前在做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. js-ES6学习笔记-async函数(2)

    1.async函数返回一个 Promise 对象. async函数内部return语句返回的值,会成为then方法回调函数的参数. async function f() { return 'hello ...

  2. Python学习笔记之——requests库

    requests库一个优雅而简单的用于Python的HTTP库,可以极大的简化我们发送http请求及获取响应的代码. requests是python的第三方库,所以使用之前需要先安装. 1.安装之后就 ...

  3. loadrunner 脚本开发- web_url函数详解

    脚本开发- web_url函数详解 by:授客 QQ:1033553122   加载指定url的web页面(GET请求) C语言函数 int web_url( const char *StepName ...

  4. 在Android Studio中调用so中的方法

    本节用的so是上节用Android Studio创建的so.想在Android Studio中调用so中的方法,需要先引用so.Android Studio中引用so的方法有二种,下面开始介绍. 一 ...

  5. WiFi 统一管理以及设备自动化测试实践

    ATX 安卓设备 WiFi 统一管理以及设备自动化测试实践 (零散知识梳理总结) 此文为转载,感谢作者  目录  众所周知,安卓单台设备的UI自动化测试已经比较完善了,有数不清的自动化框架或者工具.但 ...

  6. nginx 配置 非80 的其他 端口

    如果nginx的监听端口不是默认的80端口,改为其他非80端口后,后端服务tomcat中的request.getServerPort()方法无法获得正确的端口号,仍然返回到80端口.在response ...

  7. 学习git踩坑之路

    第一次使用git: 1.使用CentOS Linux release 7.3.1611 (Core),内核版本3.10.0-514.el7.x86_64 2.安装git: root权限运行:yum   ...

  8. Oracle中,时间的相关操作方法

    无论是DATE还是timestamp都可以进行加减操作.可以对当前日期加年.月.日.时.分.秒,操作不同的时间类型,有三种方法: 1 使用内置函数numtodsinterval增加小时,分钟和秒2 加 ...

  9. 转:C# 读取EXCEL文件的三种经典方法

    1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(string Path) { stri ...

  10. python基础学习23----IO模型(简)

    对于一个网络IO(network IO),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel).当一个read操作发生时,该操作会经历 ...