最近在做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. javascript:void(0)

    这是不是一个设计缺陷呢 void(0)这种用法巧妙利用void关键字的特性返回undefined(且没有副作用).因为不是关键字,比如直接使用undefined,内容可能被改写. 再来看为啥使用0,而 ...

  2. nio加强服务端并发

    究了一下Android推送,方式很多,比如用框架或者用第三方服务,在此并不讨论个中优劣.抱着学习的态度,本人不太喜欢用一些现成的东西,所以自己动手实现了一套简单的推送机制.使用TCP长连接,完成服务器 ...

  3. 00024500-0000-0000-C000-000000000046错误,在sys.web配置节添加一个用户给web站点。

    <identity impersonate ="true" userName="administrator" password="123456& ...

  4. 探 寻 宝 藏--- DP

    题目描述 传说HMH大沙漠中有一个M*N迷宫,里面藏有许多宝物.某天,Dr.Kong找到了迷宫的地图,他发现迷宫内处处有宝物,最珍贵的宝物就藏在右下角,迷宫的进出口在左上角.当然,迷宫中的通路不是平坦 ...

  5. SQL Server 大数据量分页建议方案

    简单的说就是这个 select top(20) * from( select *, rowid = row_number() over(order by xxx) from tb with(noloc ...

  6. SSMS错误:A connection was successfully established with the server, but then an error occurred during the login process

    参考: 系统太慢,实在搞不清是哪里的问题,祭出重装大法 需要安装的工具还真多,先装主要的吧.VS2013, SQL SERVER 2012,搞定.. 连个数据库试试,出错了: A connection ...

  7. JavaScript对UNIX时间戳的转换

    <script type="text/javascript"> var timestamp = '1479886513'; var d = new Date(times ...

  8. javascript基础程序(算出一个数的平方值、算出一个数的阶乘、输出!- !- !- !- !- -! -! -! -! -! 、函数三个数中的最大数)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Java学习笔记 03 数组

    一.数组的创建和使用 数组的创建和使用 >>创建方法1:先声明,再用new关键字分配内存(使用new关键字分配内存,整形数组中各个元素的初始值都为0) String str[]; str= ...

  10. PHP-仿ecshop生成验证码

    <?php /* 生成验证码 */ // 1.创建画布(基于已有图像) $n = mt_rand(1,5); $im = imagecreatefromjpeg('./images/captch ...