博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net 验证码session为null的解决方案
阅读量:7011 次
发布时间:2019-06-27

本文共 1656 字,大约阅读时间需要 5 分钟。

    

最近在做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()重载自己就够了,这个我没有实验。

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

转载于:https://www.cnblogs.com/srszzw/p/3396259.html

你可能感兴趣的文章
动态创建DataTable[转]
查看>>
【转】Linux---centos安装配置并挂载NFS
查看>>
sqlParameter的两种写法 以及存储过程还有sql语句(防注入)
查看>>
Introduction to JScritp.NET(1)
查看>>
云计算原理与实践
查看>>
C#委托的介绍(delegate、Action、Func、predicate)
查看>>
Maven使用
查看>>
Saltstack
查看>>
Java直接内存与堆内存
查看>>
PNG格式图片常见转换方法
查看>>
android Fragments详解二:创建Fragment
查看>>
本地编译并运行文件,测试运行时间并判断运行结果
查看>>
字符串封装类
查看>>
一步一步学List Control控件的用法(第三步)----设置风格 .
查看>>
Zabbix笔记
查看>>
通过命令行安装虚拟机
查看>>
webpack的使用
查看>>
如何让vim自动显示函数声明-使用 echofunc.vim插件
查看>>
React Native
查看>>
Android 4.4(KitKat)中apk包的安装过程
查看>>