最近在做Y集团的订单系统时,登陆页面在测试时发现一个以前没有注意到的问题,登陆页面需要使用验证码,引用了一个生成验证码的aspx页面,在aspx页面中生成session和验证码图片,在登陆页面的后台处理中使用这个session来判断验证码的正确与否。奇怪的是第一次登陆是没有问题的,可当登陆成功后,在session的有效期间内关闭浏览器,然后重启浏览器进入登陆页面重新登陆,登陆页面的后台却获取不到session了,刷新验证码的页面也不能使得session被登陆页面获取,后来我尝试把浏览器的cookie删除后再是,结果可以登陆了。这样原因就找到了,cookie。突然想到session的工作机制,在生成session的时候会向浏览器客户端发送一个会话id,作为cookie保存在浏览器,这样回传是服务器可以判断与哪一个用户会话相对应,突然关闭浏览器再重新打开,会话id并没有发生改变,通过测试发现管理浏览器重新打开服务端session会丢失,那么验证码页面重新生成session后却无法重新获取的原因可能是,新的session实例的会话id并没有更新回客户端,客户端返回的仍然是之前的会话id(在有效期内),这样服务器端在对应的时候找不到之前的服务器session会话了,虽然有一份新的服务端session,但是与这个已经对应不上了,这样就产生了第二次怎么样也登陆不上去的问题,解决的方法就是在登陆页面,登陆事件里做如下操作

if (Session["ValidCode"] == null)

{

Response.Redirect("Account/logoff.aspx");

return;

}

logoff.aspx页面是一个注销页面,最后悔跳转回登陆页面,

他的load事件代码如下

HttpCookie aCookie;

string cookieName;

int limit = Request.Cookies.Count;

for (int i = 0; i < limit; i++)

{

cookieName = Request.Cookies[i].Name;

aCookie = new HttpCookie(cookieName);

aCookie.Expires = DateTime.Now.AddDays(-1);

Response.Cookies.Add(aCookie);

}

Response.BufferOutput = true;

Response.Cache.SetExpires(DateTime.Now.AddMilliseconds(-1));

Response.Cache.SetCacheability(HttpCacheability.NoCache);

Response.AppendHeader("Pragma", "No-Cache");

Response.Buffer = true;

Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);

Response.Cache.SetExpires(DateTime.Now.AddDays(-1));

Response.Expires = 0;

Response.CacheControl = "no-cache";

Response.Cache.SetNoStore();

FormsAuthentication.SignOut();

Response.Redirect("../default.aspx");

据msdn文档的意思说,Response.Redirect()在这里的作用很重要,可以重新建立起会话;可能没必要这么麻烦,可能只需一次Response.Redirect()重载自己就够了,这个我没有实验。

实测有效。记录一下以备后查。

asp.net 验证码session为null的解决方案的更多相关文章

  1. webapi中session为null的解决方案

    Session  webapi中session为null的解决方案 在Global.asax里添加:开启Session功能(默认是不开启) 重写init方法 public class WebApiAp ...

  2. ASP.net 验证码(C#) MVC

    ASP.net 验证码(C#) MVC http://blog.163.com/xu_shuhao/blog/static/5257748720101022697309/ 网站添加验证码,主要为防止机 ...

  3. ASP与ASP.NET转换Session数据桥的应用

    背景: 现有公司的产品OA是采用ASP早先的技术开发,需要与目前最新的ASP.NET产品进行数据交互的应用.现有的ASP应用程序往往采用“ASP Sessions”,这是一种经典的ASP内置模式,即允 ...

  4. 如何实现Asp与Asp.Net共享Session

    <iframe align="top" marginwidth="0" marginheight="0" src="http ...

  5. Asp.Net MVC session跨域

    目的 在公司项目的某个特定场景中,需要在站点B的后端伪造请求,获取站点A的登录状态,抓取站点A的页面内容,因此要用实现session的跨域.以注册功能为例. 步骤 原理 简单地说,对于ASP.Net应 ...

  6. MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式

    MVC的验证(模型注解和非侵入式脚本的结合使用)   @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...

  7. IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题

    IT咨询顾问:一次吐血的项目救火   年后的一个合作公司上线了一个子业务系统,对接公司内部的单点系统.我收到该公司的技术咨询:项目启动后没有规律的突然无法登录了,重新启动后,登录一断时间后又无法重新登 ...

  8. System.Web.HttpContext.Current.Session为NULL解决方法

    http://www.cnblogs.com/tianguook/archive/2010/09/27/1836988.html 自定义 HTTP 处理程序,从IHttpHandler继承,在写Sys ...

  9. ASP.NET的session操作方法总结

    在开发ASP.NET程序时,需要对相关数据进行缓存,缓存较多的主要是用户的身份信息,现提供几个对session操作较为常用的方法: 1.添加session,对设置对应的时间: /// <summ ...

随机推荐

  1. xenomai for at91

    http://www.at91.com/linux4sam/bin/view/Linux4SAM/RealTime#Xenomai

  2. HTML5之tabindex属性

    1 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title&g ...

  3. Http请求中Content-Type讲解以及在Spring MVC中的应用

    引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...

  4. Mysql连接到Visual studio注意

    测试环境:mysql(mysql-connector-net-6.9.7.msi)+visual studio2012 1.mysql安装ok的情况下!在控制面板管理工具-数据源(ODBC)--用户D ...

  5. ZOJ3790_Consecutive Blocks

    给出一个数组,最多可以删除k个数,问能够获得的最长的一个数字连续段为多少? 把所有相同的数字都提取出来,保存取得每个数字需要删除的数字,然后二分枚举就可以了. 召唤代码君: #include < ...

  6. heap c++ 操作 大顶堆、小顶堆

    在C++中,虽然堆不像 vector, set 之类的有已经实现的数据结构,但是在 algorithm.h 中实现了一些相关的模板函数.下面是一些示例应用 http://www.cplusplus.c ...

  7. Yosemite 快速搭建 自带Apache+PHP5.6+MySQL 开发环境

    1.安装homebrew ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)" 2.安装h ...

  8. 【转】gtk+多线程的程序实例

    #include <gtk/gtk.h> gint test() { while(1) { gdk_threads_enter(); g_printf("hello\n" ...

  9. ELK 5.0 组件后台启动

    elasticsearch 后台启动,只需要 在bin目录下执行: ./elasticsearch -d 查看是否启动成功使用: ps aux|grep elasticsearch kibana 后台 ...

  10. 黑马程序员_Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项

    ------- android培训.java培训.期待与您交流! ---------- 首先来看一段代码: Integer x = new Integer(4); Integer y = 4; 在JD ...