Default.aspx
1: <table>
2: <tr>
3: <td class="style1">
4: (验证码测试)</td>
5: <td>
6: <asp:Label
7: ID="Label1" runat="server"></asp:Label>
8:
9: <asp:Image ID="Image1" runat="server" Height="22px" ImageUrl="~/ValidNums.aspx" Width="58px" />
10: <asp:Image ID="Image2" runat="server" Height="22px" ImageUrl="~/GetValid.aspx" Width="58px" /></td>
11: </tr> <tr>
12: <td class="style1">
13:
14: </td>
15: <td>
16: <asp:Button ID="Button1" runat="server" Text="登录" OnClick="btnOK_Click" />
17:
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存值处理。