遇到session和验证码不同步的问题了,session获取到的验证码总要比显示的值慢一拍,也就是说总是上一次的验证码。百度了下,发现这个问题非常多,但是却没找到一个解决的办法,如果不用session用什么好呢,cookie的话不太靠谱啊,可以直接读取到cookie的值,这样就能绕过验证了。产生验证码的页面,image.aspx.csprivate string GenerateCheckCode()
        {
            String RandomCode = String.Empty;
            //随机生成2个数字A,B
            System.Random a = new Random(System.DateTime.Now.Millisecond);
            Int32 A = a.Next(10, 30);
            Int32 B = a.Next(1, 20);
            String jieguo = (A + B).ToString();
            //写入Session
             Session["CheckCode"] = jieguo;
            //HttpContext.Current.Session["CheckCode"] = jieguo;
            //写入cookie,由于没加密容易被获取放弃不用
            //Response.Cookies.Add(new HttpCookie("CheckCode", jieguo));
            //图片上要显示的内容
            RandomCode = "请计算" + A.ToString() + "加" + B.ToString() + "等于几";
            //写入函数用来调用
            return RandomCode;调用验证码页面: protected void Page_Load(object sender, EventArgs e)
        {
            string yanzhenma = string.Empty;
            if (HttpContext.Current.Session["CheckCode"] != null)
            {
                yanzhenma = HttpContext.Current.Session["CheckCode"].ToString();
            }
            String jg = jieguo.Text.ToString();
            if (jg != yanzhenma)
            {
                yzm("不一样");
            }
            else
            {
                yzm("一样");
            }
        }
测试发现,只要输入上一次的值,就弹出一样,输入当前值弹出不一样,问题的原因弄清楚了,就是获取session是在写入session之前,所以出现这样的情况,有什么办法解决吗?谢谢

解决方案 »

  1.   

    会不会是GenerateCheckCode()每次浏览都调用了?
      

  2.   

    if(IsPostBack)
    {
    //
    }
    页面<IMG src="CheckCode.aspx" align="absmiddle">
     if (Page.IsValid)
            {
                判断验证码
               }
      

  3.   

    page_load是加载时执行的事件,你怎么能用来处理业务呢?你的处理代码根本不应该写在page_load中。看看asp.net页面的生命周期,想想你的代码应该写在哪个处理阶段,才能等其它业务事件都处理完了,才正确地输出结果!
      

  4.   

    找一张小纸片,画出代码执行的时序图,自己看看。另外,在繁忙一点的服务器上,或者程序大一点,session集合内的数据是会(必然会)丢失的,所以我们从来不用session集合保存业务数据。
      

  5.   

    问题解决了,就是2楼的代码。加一个if(IsPostBack)就好了。我其实也不想用session的,我在做一个信息发布平台,需要一个强度的验证,验证码做出来了,就是这个值储存方式,刚开始用的是cookies,直接把值放进去,然后客户端用js读取这个cookie和表单值对比。假如有注册机去注册发帖,遇到验证,它可以直接读取cookie的内容然后写入验证值,这样就绕过验证了。
    所以就想到用session,但是session一是耗资源,而是也不稳定。有想过用cookie写入md5加密的验证码值,不知道效果怎样。