就如同登录本论坛时的校验码,每次都不同。

解决方案 »

  1.   

    代码: public class VerifyCode {      public VerifyCode()      {      }        public static string Generate(int length)      {          string s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//0123456789";           System.Text.StringBuilder sb = new System.Text.StringBuilder(length);          Random r = new Random();             for(int i = 0; i < length; i++)          {               sb.Append(s[r.Next(0, s.Length)]);          }          return sb.ToString();      }        public static void WriteToOutput(string verifyCode, HttpResponse response)      {          int fontSize;           fontSize = 11;             System.Drawing.Bitmap bitmap = new Bitmap(verifyCode.Length * (fontSize + 2), 45);           Graphics g = Graphics.FromImage(bitmap);            Font f = new System.Drawing.Font("Arial", fontSize);          Brush b = null;//new System.Drawing.SolidBrush(Color.White);             g.Clear(Color.Blue);            Random r = new Random();             for(int i = 0; i < verifyCode.Length; i++)          {               b = new SolidBrush(Color.FromArgb(r.Next(204, 255), r.Next(204, 255), r.Next(204, 255)));               g.DrawString(verifyCode[i].ToString(), f, b, 10 + 11 * i, r.Next(10, 20));          }            bitmap = TwistImage(bitmap);          bitmap = AddNoisePointToImage(bitmap);             System.IO.MemoryStream ms = new System.IO.MemoryStream();           bitmap.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);           response.ClearContent();             response.ContentType = "image/Jpeg";           response.BinaryWrite(ms.ToArray());             g.Dispose();           bitmap.Dispose();      }        private static Bitmap TwistImage(Bitmap bitmap)      {          Bitmap bitmapret = new Bitmap(bitmap);           Graphics g = Graphics.FromImage(bitmapret);           g.Clear(Color.Blue);             bitmapret = AddNoiseLineToImage(bitmapret);//在这里加噪音弧线可以保证其不影响人对验证码的识别            Random r = new Random();          double k = Convert.ToDouble(r.Next(0, 4));            try          {               for (int j = 0; j < bitmapret.Width; j++)               {                    int offset = Convert.ToInt32(Math.Sin(Convert.ToDouble(j) / 20 + k) * 10);                      for(int i = bitmapret.Height - 10; i > 10; i--)                        if(i + offset >= 0 && i + offset < bitmapret.Height)                             bitmapret.SetPixel(j, i + offset, bitmap.GetPixel(j, i));               }               return bitmapret;          }          catch (Exception)          {               throw;          }      }        private static Bitmap AddNoiseLineToImage(Bitmap bitmap)      {          Random r = new Random();             for(int i = 0; i < bitmap.Width * bitmap.Height / 200; i++)          {               Point point = new Point(r.Next(1, bitmap.Width), r.Next(1, bitmap.Height));               Size size = new Size(r.Next(10, 20), r.Next(10, 20));                 int startAngle = r.Next(0, 360);               int sweepAngle = r.Next(startAngle, startAngle + r.Next(60, 180));                 Pen pen = new Pen(Color.FromArgb(r.Next(204, 255), r.Next(204, 255), r.Next(204, 255)), (float)1);               Graphics g = Graphics.FromImage(bitmap);               g.DrawArc(pen, new Rectangle(point, size), startAngle, sweepAngle);                 g.Dispose();          }            return bitmap;      }        private static Bitmap AddNoisePointToImage(Bitmap bitmap)      {          Random r = new Random();            for (int num1 = 0; num1 < (bitmap.Height - 1); num1++)          {               for (int num2 = 0; num2 < (bitmap.Width - 1); num2++)               {                    Color color1 = bitmap.GetPixel(num2, num1);                   if(r.Next(0, 40) == 20)                    {                         bitmap.SetPixel(num2, num1, Color.FromArgb(r.Next(204, 255), r.Next(204, 255), r.Next(204, 255)));                    }               }          }            return bitmap;      } } 
    调用: 
    Session["VerifyCode"] = VerifyCode.Generate(10); 
    VerifyCode.WriteToOutput(Session["VerifyCode"].ToString(), this.Response); 
    验证: 
    if(this.TextBox1.Text == Session["VerifyCode"].ToString())      this.Literal1.Text = "验证成功!"; else      this.Literal1.Text = "验证失败!"; 
      

  2.   

    http://community.csdn.net/Expert/topic/4084/4084074.xml?temp=.372555
      

  3.   

    http://blog.csdn.net/codeangel/archive/2005/06/20/398860.aspx
      

  4.   

    基本原理如下:
    1、将一个img的src指向一个aspx页面
    2、这个页面将随机生成一些数字或者字母
    3、然后使用画图类将这些文字话在一个图片流中
    4、将这个流作为aspx的输出流即可。
      

  5.   

    在补充楼上
    还有验证值可以记录在ViewState里面
      

  6.   

    应该将得到的值用session保存并一起提交核对
      

  7.   

    验证值不要保存在ViewState
    因为ViewState会传到客户端,很容易解码的,所以最好保存到Session里,但听说会对资源占用有点影响
      

  8.   

    搜索引擎查一下,非常多的,比如:
    http://www.baidu.com/s?wd=%A1%B1ASP.NET+%D1%E9%D6%A4%C2%EB+%D4%B4%B4%FA%C2%EB%A1%B0&cl=3
      

  9.   

    http://community.csdn.net/Expert/topic/4235/4235257.xml?temp=.9419672 我就是照着这里的Toti说的方法发做的,谢谢
      

  10.   

    1、将一个img的src指向一个aspx页面
    2、这个页面将随机生成一些数字或者字母
    3、然后使用画图类将这些文字话在一个图片流中
    4、将这个流作为aspx的输出流即可。
    ~~~~~~~~~~~~~~~~~~~~~~~~~~
    上面是生成图片的原理,主要目的是防止用户通过其他方式登入或者提交信息
    1。在用户访问登入或者提交页(下称为操作页),生成一个随机数字,保存在变量中(SESSION,COOKIE,VIEWSTATE)都可以,
    2。把这个数字生成图片标志作为验证码的提示
    3。表单提交后,判断验证框写的是否和 变量相等。