3种验证码示例(代码)(数字,数字字母混和,汉字)

abcc

Default.aspx

   1: <table> 
   2:   <tr>
   3:           <td class="style1">
   4:               &nbsp;(验证码测试)</td>
   5:           <td>
   6:           &nbsp; <asp:Label
   7:                   ID="Label1" runat="server"></asp:Label>
   8:           &nbsp;
   9:               <asp:Image ID="Image1" runat="server" Height="22px" ImageUrl="~/ValidNums.aspx" Width="58px" />&nbsp;
  10:               <asp:Image ID="Image2" runat="server" Height="22px" ImageUrl="~/GetValid.aspx" Width="58px" /></td>
  11:       </tr>  <tr>
  12:           <td class="style1">
  13:               &nbsp;
  14:           </td>
  15:           <td>
  16:               &nbsp;&nbsp;<asp:Button ID="Button1" runat="server" Text="登录" OnClick="btnOK_Click" />
  17:               &nbsp;&nbsp;
  18:               <asp:Button ID="Button2" runat="server" Text="取消" />
  19:           </td>
  20:       </tr>
  21:   </table> 
   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.Web.UI;
   6: using System.Web.UI.WebControls;
   7:  
   8: public partial class _Default : System.Web.UI.Page
   9: {
  10:     protected void Page_Load(object sender, EventArgs e)
  11:     {
  12:         if (!Page.IsPostBack)
  13:         {
  14:             string getNums = GetVali();
  15:             Label1.Text = getNums;
  16:         }
  17:     }  
  18:     
  19:     /// <summary>
  20:     /// 随机生成4位数
  21:     /// </summary>
  22:     /// <returns>返回生成的随机数</returns>
  23:     public string GetVali()
  24:     {
  25:         string strsvali = "0,1,2,3,4,5,6,7,8,9";
  26:         string[] ValiArray = strsvali.Split(',');
  27:         string ReturnNum = "";
  28:         int nums = -1;
  29:         Random vrand = new Random();
  30:         for (int n = 1; n < 5; n++)
  31:         {
  32:             if (nums != -1)
  33:             {
  34:                 vrand = new Random(n * nums * unchecked((int)DateTime.Now.Ticks));
  35:             }
  36:             int t = vrand.Next(10);
  37:             nums = t;
  38:             ReturnNum += ValiArray[t];
  39:         }
  40:         Session["Valid"] = ReturnNum;
  41:         return ReturnNum;
  42:     }
  43:     protected void btnOK_Click(object sender, EventArgs e)
  44:     {
  45:         if (Session["Valid"].ToString() == TextBox3.Text)
  46:         { 
  47:             ClientScript.RegisterStartupScript(this.GetType(),"ss","<script>alert('您已经成功通过登录验证!')</script>");
  48:         }
  49:         else
  50:         {
  51:             ClientScript.RegisterStartupScript(this.GetType(), "ss", "<script>alert('您输入的验证码错误!')</script>");
  52:         }
  53:     }
  54: }

GetValid.aspx

(可以直接将该页面作为源赋值给ImageUrl)

前台为空,后台代码如下:

   1: using System;
   2: using System.Collections;
   3: using System.Configuration;
   4: using System.Data;
   5: using System.Linq;
   6: using System.Web;
   7: using System.Web.Security;
   8: using System.Web.UI;
   9: using System.Web.UI.HtmlControls;
  10: using System.Web.UI.WebControls;
  11: using System.Web.UI.WebControls.WebParts;
  12: using System.Xml.Linq;
  13: using System.Text;
  14: using System.Drawing;
  15:  
  16: public partial class GetValid : System.Web.UI.Page
  17: {
  18:     protected void Page_Load(object sender, EventArgs e)
  19:     {
  20:         if (!IsPostBack)
  21:         {
  22:             string validateNum = GetValids();                 //成生4位随机字符串
  23:             CreateImage(validateNum);                         //将生成的随机字符串绘成图片
  24:             Session["ValidNums"] = validateNum;               //保存验证码
  25:         }
  26:     }
  27:     public static  string GetValids()
  28:     {
  29:         //获取GB2312编码页(表)     
  30:         Encoding gb = Encoding.GetEncoding("gb2312");
  31:  
  32:         //调用函数产生4个随机中文汉字编码     
  33:         object[] bytes = CreateRegionCode(4);
  34:  
  35:         //根据汉字编码的字节数组解码出中文汉字   
  36:  
  37:         string s = String.Empty;
  38:         foreach (object byt in bytes)
  39:         {
  40:             string str1 = gb.GetString((byte[])Convert.ChangeType(byt, typeof(byte[])));
  41:             s = s + str1;
  42:         }
  43:  
  44:         //输出的控制台     
  45:         return s;
  46:     }
  47:     public static object[] CreateRegionCode(int strlength)
  48:     {
  49:         //定义一个字符串数组储存汉字编码的组成元素     
  50:         string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
  51:  
  52:         Random rnd = new Random();
  53:  
  54:         //定义一个object数组用来     
  55:         object[] bytes = new object[strlength];
  56:         /*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中     
  57:          每个汉字有四个区位码组成     
  58:           区位码第1位和区位码第2位作为字节数组第一个元素     
  59:           区位码第3位和区位码第4位作为字节数组第二个元素     
  60:          */
  61:         for (int i = 0; i < strlength; i++)
  62:         {
  63:             //区位码第1位     
  64:             int r1 = rnd.Next(11, 14);
  65:             string str_r1 = rBase[r1].Trim();
  66:  
  67:             //区位码第2位     
  68:             rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);
  69:             //更换随机数发生器的种子避免产生重复值     
  70:             int r2;
  71:             if (r1 == 13)
  72:             {
  73:                 r2 = rnd.Next(0, 8);
  74:             }
  75:             else
  76:             {
  77:                 r2 = rnd.Next(0, 16);
  78:             }
  79:             string str_r2 = rBase[r2].Trim();
  80:  
  81:             //区位码第3位     
  82:             rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
  83:             int r3 = rnd.Next(10, 16);
  84:             string str_r3 = rBase[r3].Trim();
  85:  
  86:             //区位码第4位     
  87:             rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
  88:             int r4;
  89:             if (r3 == 10)
  90:             {
  91:                 r4 = rnd.Next(1, 16);
  92:             }
  93:             else if (r3 == 15)
  94:             {
  95:                 r4 = rnd.Next(0, 15);
  96:             }
  97:             else
  98:             {
  99:                 r4 = rnd.Next(0, 16);
 100:             }
 101:             string str_r4 = rBase[r4].Trim();
 102:  
 103:             //定义两个字节变量存储产生的随机汉字区位码     
 104:             byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
 105:             byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
 106:             //将两个字节变量存储在字节数组中     
 107:             byte[] str_r = new byte[] { byte1, byte2 };
 108:  
 109:             //将产生的一个汉字的字节数组放入object数组中     
 110:             bytes.SetValue(str_r, i);
 111:  
 112:         }
 113:  
 114:         return bytes;
 115:  
 116:     }
 117:         //生成图片
 118:     private void CreateImage(string validateNum)
 119:     {
 120:         if (validateNum == null || validateNum.Trim() == String.Empty)
 121:             return;
 122:         //生成Bitmap图像
 123:         System.Drawing.Bitmap image = new System.Drawing.Bitmap(validateNum.Length * 12 + 10, 22);
 124:         Graphics g = Graphics.FromImage(image);
 125:  
 126:         try
 127:         {
 128:             //生成随机生成器 
 129:             Random random = new Random();
 130:  
 131:             //清空图片背景色 
 132:             g.Clear(Color.White);
 133:  
 134:             //画图片的背景噪音线 
 135:             for (int i = 0; i < 25; i++)
 136:             {
 137:                 int x1 = random.Next(image.Width);
 138:                 int x2 = random.Next(image.Width);
 139:                 int y1 = random.Next(image.Height);
 140:                 int y2 = random.Next(image.Height);
 141:  
 142:                 g.DrawLine(new Pen(Color.Coral), x1, y1, x2, y2);
 143:             }
 144:  
 145:             Font font = new System.Drawing.Font("Arial", 8);
 146:             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);
 147:             g.DrawString(validateNum, font, brush, 2, 2);
 148:  
 149:             //画图片的前景噪音点 
 150:             for (int i = 0; i < 100; i++)
 151:             {
 152:                 int x = random.Next(image.Width);
 153:                 int y = random.Next(image.Height);
 154:                 image.SetPixel(x, y, Color.FromArgb(random.Next()));
 155:             }
 156:  
 157:             //画图片的边框线 
 158:             g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
 159:  
 160:             System.IO.MemoryStream ms = new System.IO.MemoryStream();
 161:             //将图像保存到指定的流
 162:             image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
 163:             Response.ClearContent();
 164:             Response.ContentType = "image/Gif";
 165:             Response.BinaryWrite(ms.ToArray());
 166:         }
 167:         finally
 168:         {
 169:             g.Dispose();
 170:             image.Dispose();
 171:         }
 172:     }
 173: }

ValidNums.aspx

(可以直接将该页面作为源赋值给ImageUrl)

前台为空,后台代码如下:

   1: using System;
   2: using System.Collections;
   3: using System.Configuration;
   4: using System.Data;
   5: using System.Linq;
   6: using System.Web;
   7: using System.Web.Security;
   8: using System.Web.UI;
   9: using System.Web.UI.HtmlControls;
  10: using System.Web.UI.WebControls;
  11: using System.Web.UI.WebControls.WebParts;
  12: using System.Xml.Linq;
  13: using System.Drawing;
  14:  
  15: public partial class ValidNums : System.Web.UI.Page
  16: {
  17:     protected void Page_Load(object sender, EventArgs e)
  18:     {
  19:         if (!IsPostBack)
  20:         {
  21:             string validateNum = CreateRandomNum(4);          //成生4位随机字符串
  22:             CreateImage(validateNum);                         //将生成的随机字符串绘成图片
  23:             Session["ValidNums"] = validateNum;               //保存验证码
  24:         }
  25:     }
  26:     //生成随机字符串
  27:     private string CreateRandomNum(int NumCount)
  28:     {
  29:         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";
  30:         string[] allCharArray = allChar.Split(',');//拆分成数组
  31:         string randomNum = "";
  32:         int temp = -1;//记录上次随机数的数值,尽量避免产生几个相同的随机数
  33:         Random rand = new Random();
  34:         for (int i = 0; i < NumCount; i++)
  35:         {
  36:             if (temp != -1)
  37:             {
  38:                 rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
  39:             }
  40:             int t = rand.Next(35);
  41:             if (temp == t)
  42:             {
  43:                 return CreateRandomNum(NumCount);
  44:             }
  45:             temp = t;
  46:             randomNum += allCharArray[t];
  47:         }
  48:         return randomNum;
  49:     }
  50:     //生成图片
  51:     private void CreateImage(string validateNum)
  52:     {
  53:         if (validateNum == null || validateNum.Trim() == String.Empty)
  54:             return;
  55:         //生成Bitmap图像
  56:         System.Drawing.Bitmap image = new System.Drawing.Bitmap(validateNum.Length * 12 + 10, 22);
  57:         Graphics g = Graphics.FromImage(image);
  58:  
  59:         try
  60:         {
  61:             //生成随机生成器 
  62:             Random random = new Random();
  63:  
  64:             //清空图片背景色 
  65:             g.Clear(Color.White);
  66:  
  67:             //画图片的背景噪音线 
  68:             for (int i = 0; i < 25; i++)
  69:             {
  70:                 int x1 = random.Next(image.Width);
  71:                 int x2 = random.Next(image.Width);
  72:                 int y1 = random.Next(image.Height);
  73:                 int y2 = random.Next(image.Height);
  74:  
  75:                 g.DrawLine(new Pen(Color.Coral), x1, y1, x2, y2);
  76:             }
  77:  
  78:             Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
  79:             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);
  80:             g.DrawString(validateNum, font, brush, 2, 2);
  81:  
  82:             //画图片的前景噪音点 
  83:             for (int i = 0; i < 100; i++)
  84:             {
  85:                 int x = random.Next(image.Width);
  86:                 int y = random.Next(image.Height);
  87:                 image.SetPixel(x, y, Color.FromArgb(random.Next()));
  88:             }
  89:  
  90:             //画图片的边框线 
  91:             g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
  92:  
  93:             System.IO.MemoryStream ms = new System.IO.MemoryStream();
  94:             //将图像保存到指定的流
  95:             image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
  96:             Response.ClearContent();
  97:             Response.ContentType = "image/Gif";
  98:             Response.BinaryWrite(ms.ToArray());
  99:         }
 100:         finally
 101:         {
 102:             g.Dispose();
 103:             image.Dispose();
 104:         }
 105:     }
 106: }

以上是3种验证码的全部代码。

另外也可以使用ashx请求验证码的方式,本示例仅使用Session存值处理。

原文地址:https://www.cnblogs.com/jx270/p/2741973.html