asp.net 验证码session为null的解决方案

    

最近在做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