none
Cookies问题 RRS feed

  • 问题

  • 我的上一个问题地址http://forums.microsoft.com/china/ShowPost.aspx?PostID=4262792&SiteID=15

     Thank  Daniel Chow (周建春)  的确是我的 public static SqlCommand cmd=new SqlCommand(); 问题.但是这个问题解决后发现我的验证码也出现了问题..

     

    我是用的CheckCode.aspx 页代码如下:

     private void Page_Load(object sender, System.EventArgs e)
        {
            this.CreateCheckCodeImage(GenerateCheckCode());
        }

        #region Web 窗体设计器生成的代码
        override protected void OnInit(EventArgs e)
        {
            //
            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
            //
            InitializeComponent();
            base.OnInit(e);
        }

        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.Load += new System.EventHandler(this.Page_Load);
        }
        #endregion

        private string GenerateCheckCode()
        {
            int number;
            char code;
            string checkCode = String.Empty;

            System.Random random = new Random();

            for (int i = 0; i < 4; i++)
            {
                number = random.Next();

                if (number % 2 == 0)
                    code = (char)('0' + (char)(number % 10));
                else
                    code = (char)('A' + (char)(number % 26));

                checkCode += code.ToString();
            }

            Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));


            return checkCode;
        }

        private void CreateCheckCodeImage(string checkCode)
        {
            if (checkCode == null || checkCode.Trim() == String.Empty)
                return;

            System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
            Graphics g = Graphics.FromImage(image);

            try
            {
                //生成随机生成器
                Random random = new Random();

                //清空图片背景色
                g.Clear(Color.White);

                //画图片的背景噪音线
                for (int i = 0; i < 25; i++)
                {
                    int x1 = random.Next(image.Width);
                    int x2 = random.Next(image.Width);
                    int y1 = random.Next(image.Height);
                    int y2 = random.Next(image.Height);

                    g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
                }

                Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
                System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
                g.DrawString(checkCode, font, brush, 2, 2);

                //画图片的前景噪音点
                for (int i = 0; i < 100; i++)
                {
                    int x = random.Next(image.Width);
                    int y = random.Next(image.Height);

                    image.SetPixel(x, y, Color.FromArgb(random.Next()));
                }

                //画图片的边框线
                g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                Response.ClearContent();
                Response.ContentType = "image/Gif";
                Response.BinaryWrite(ms.ToArray());
             
            }
            finally
            {
                g.Dispose();
                image.Dispose();
            }
        }

    登录也前台代码

     protected void ibLogin_Click(object sender, ImageClickEventArgs e)
        {
            if (String.Compare(Request.Cookies["CheckCode"].Value,txtValidCode.Text,true)==0)
            {
           
                string username = TxtUserName.Text;
                string userpassWord = TxtPassWord.Text;
                if (Admin.ValidateAdmin(username, userpassWord))
                {
                    Session["userName"] = username;
                    Response.Redirect("Main/index.html");
                }
                else
                {
                    lbMsg.Text = "用户名不存在或者密码错误";
                    TxtUserName.Text = "";
                    TxtPassWord.Text = "";
                    TxtUserName.Focus();
                }
               
           }
            else
            {
               
                lbMsg.Text = "验证码错误";
                txtValidCode.Focus();
            }
        }

    注意我加色的地方.也是第一登录没问题.在登录就说我连接有问题..经过测试发现.把验证码去掉就没问题.总感觉是这个

    String.Compare(Request.Cookies["CheckCode"].Value,txtValidCode.Text,true 也就是把checkcode放到cookies 有问题..去掉验证码登录帐号一切正常..请求帮助啊

    2008年12月28日 5:31

答案

  • 你的代码我看了,问题不应当出在Cookie上,即使 Cookie有问题,也保证不会出现连接尚未初始化的错误,很明显,这个错误是由数据库的操作习惯造成的。
     
    在.NET中,要慎用static关键字。问题应当出在你的DB.cs
     
    如何验证问题是出在 DB.cs?
     
    你可以在代码中 操作数据库的时候,不使用这个类,而是每次都 new SqlConnection("数据库连接"); 然后new SqlCommand就可以测试出来了
     
    2008年12月30日 1:35
    版主
  • 我的感觉和楼上孟老师的差不多,看你贴出来的CheckCode.aspx 应该是没什么问题的,你彻底的查一下你这个项目里的static 关键字。 很可能有的地方有关联,造成的。

    2008年12月31日 3:39
    版主

全部回复

  •  

    这些不会造成影响啊。经测试没有问题。

    String.Compare只是进行字符串的比较,不会产生错误。

     

    2008年12月28日 6:45
    版主
  • 孟老师 我的程序的确很怪的.如果用我上面的那个验证码程序就有问题..可否发给你份我的程序.帮我看下. 我一直没找到原因.程序不用验证码一切正常 .请告诉我你的Email 谢谢孟老师

     

    2008年12月29日 6:49
  • amxh@21cn.com

    我的测试环境是vs2008,你的环境是什么?


    发程序不要带数据库,建议只发育问题相关的最少的代码,发之前请确认下问题是否真的存在。
    2008年12月29日 7:08
    版主
  •  

    恩 问题还是存在...我发过去了程序.
    2008年12月29日 7:15
  •  

    我的环境是vs 2005
    2008年12月29日 7:16
  • 其实我第一个回复的时候就拷贝你贴的代码测试的,我收到后再看一下
    2008年12月29日 7:22
    版主
  •  

    恩,,好的..程序已经发送完毕.你看以下.我发邮件里都说明问题的性质了.麻烦孟老师了......
    2008年12月29日 7:31
  • 孟老师..我的程序你看了吗?什么问题导致的阿

     

    2008年12月30日 1:21
  • 你的代码我看了,问题不应当出在Cookie上,即使 Cookie有问题,也保证不会出现连接尚未初始化的错误,很明显,这个错误是由数据库的操作习惯造成的。
     
    在.NET中,要慎用static关键字。问题应当出在你的DB.cs
     
    如何验证问题是出在 DB.cs?
     
    你可以在代码中 操作数据库的时候,不使用这个类,而是每次都 new SqlConnection("数据库连接"); 然后new SqlCommand就可以测试出来了
     
    2008年12月30日 1:35
    版主
  •  

    很多人还在用错误思想下的错误数据访问类

     

    .net早就给大家推出了轻量级的 dataset-tableadepter   可惜这么少人用  哎

    2008年12月30日 1:47
  •  

    孟老师那为什么.我用session 记录验证码就没问题.怎么用cookies的就有问题那.一直搞不明白..
    2008年12月30日 8:13
  •  

    还有就是用Cookie 那个验证码.第一次登录没问题在登录就有问题.所以一直困惑不解.如果是静态类的问题.不使用验证码却没这么多问题...困惑中阿..........................
    2008年12月30日 8:17
  • 验证码又不读取数据库,与此无关。
    自己分析你的程序逻辑,static的变量是整个应用程序范围那共用的,多个用户有可能会破坏 这些变量,因此,出现这样的错误一般是程序逻辑不严密造成的


    2008年12月30日 9:44
    版主
  • 我的感觉和楼上孟老师的差不多,看你贴出来的CheckCode.aspx 应该是没什么问题的,你彻底的查一下你这个项目里的static 关键字。 很可能有的地方有关联,造成的。

    2008年12月31日 3:39
    版主
  • 也许是static 问题????但是我以前做的例子就是没有验证码程序一直没问题..我换个用Sessino["CheckCode"] 接受验证码的就没问题.不知道为啥用cookies 接受的验证码就有问题

     

    2008年12月31日 4:23
  • 验证码的保存一般都选择用session,相对于客户端的 cookie 而言 session 要稳定得多。

     

    2008年12月31日 15:26
    版主