黑马程序员技术交流社区

标题: 怎么实现随机验证码? [打印本页]

作者: 李永涛    时间: 2012-11-25 01:55
标题: 怎么实现随机验证码?
本帖最后由 李永涛 于 2012-11-25 18:58 编辑

比如在验证时,界面上出现一个验证码图标,我想知道这种随机验证码图标的出现怎么实现?有看到说是GDI?
作者: 王继光    时间: 2012-11-25 08:15
最新第10季 asp基础视频  第 17 - 19课  仔细看。。 可以解决你的问题。
作者: 吴步兵    时间: 2012-11-25 14:00
  1. /// <summary>
  2.         /// 随即从"0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z"中取codeCount个字符组成验证码字符串
  3.         /// </summary>
  4.         /// <param name="codeCount">验证码长度</param>
  5.         /// <returns></returns>
  6.         private string CreateRandomCode(int codeCount)
  7.         {
  8.             string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";
  9.             string[] allCharArray = allChar.Split(',');
  10.             string randomCode = "";
  11.             int temp = -1;

  12.             Random rand = new Random();
  13.             for (int i = 0; i < codeCount; i++)
  14.             {
  15.                 if (temp != -1)
  16.                 {
  17.                     rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
  18.                 }
  19.                 int t = rand.Next(35);
  20.                 if (temp == t)
  21.                 {
  22.                     return CreateRandomCode(codeCount);
  23.                 }
  24.                 temp = t;
  25.                 randomCode += allCharArray[t];
  26.             }
  27.             return randomCode;
  28.         }


  29.         /// <summary>
  30.         /// 根据验证码字符生成图片
  31.         /// </summary>
  32.         /// <param name="checkCode">验证码字符</param>
  33.         private void CreateImage(string checkCode)
  34.         {
  35.             int iwidth = (int)(checkCode.Length * 10.5);
  36.             System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 18);
  37.             System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
  38.             System.Drawing.Font f = new System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold);
  39.             System.Drawing.Brush b = new System.Drawing.SolidBrush(System.Drawing.Color.White);


  40.             g.Clear(System.Drawing.Color.Blue);
  41.             g.DrawString(checkCode, f, b, 3, 1);

  42.             System.Drawing.Pen blackPen = new System.Drawing.Pen(System.Drawing.Color.Black, 0);
  43.             Random rand = new Random();
  44.             for (int i = 0; i < 3; i++)
  45.             {
  46.                 int y = rand.Next(image.Height);
  47.                 g.DrawLine(blackPen, 0, y, image.Width, y);
  48.             }

  49.             System.IO.MemoryStream ms = new System.IO.MemoryStream();
  50.             image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
  51.             HttpContext.Current.Response.ClearContent();
  52.             HttpContext.Current.Response.ContentType = "image/Jpeg";
  53.             HttpContext.Current.Response.BinaryWrite(ms.ToArray());
  54.             g.Dispose();
  55.             image.Dispose();
  56.         }



  57.         public void ProcessRequest(HttpContext context)
  58.         {
  59.             string checkCode = CreateRandomCode(4);
  60.             HttpContext.Current.Session["CheckCode"] = checkCode.ToLower();
  61.             CreateImage(checkCode);
  62.         }

  63.         public bool IsReusable
  64.         {
  65.             get
  66.             {
  67.                 return false;
  68.             }
  69.         }
复制代码
一个简单的例子。
作者: 李永涛    时间: 2012-11-25 18:57
多谢了···
作者: 杨占伟    时间: 2012-11-26 00:05
路过,学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2