本文实例为大家分享了ASP.NET验证码的具体代码,供大家参考,具体内容如下
我主要是看到干扰线了,一个验证码里面要是没有干扰线什么的,至少得在噪点和随机码的排版上下工夫:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
/// <summary> /// 验证码生成类 /// </summary> public class verify_code : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { int codeW = 80; int codeH = 22; int fontSize = 16; string chkCode = string .Empty; //颜色列表,用于验证码、噪线、噪点 Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue }; //字体列表,用于验证码 string [] font = { "Times New Roman" , "Verdana" , "Arial" , "Gungsuh" , "Impact" }; //验证码的字符集,去掉了一些容易混淆的字符 char [] character = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '8' , '9' }; Random rnd = new Random(); //生成验证码字符串 for ( int i = 0; i < 4; i++) { chkCode += character[rnd.Next(character.Length)]; } //写入Session context.Session[ "sys_verify_code" ] = chkCode; //创建画布 Bitmap bmp = new Bitmap(codeW, codeH); Graphics g = Graphics.FromImage(bmp); g.Clear(Color.White); //画噪线 for ( int i = 0; i < 4; i++) { int x1 = rnd.Next(codeW); int y1 = rnd.Next(codeH); int x2 = rnd.Next(codeW); int y2 = rnd.Next(codeH); Color clr = color[rnd.Next(color.Length)]; g.DrawLine( new Pen(clr), x1, y1, x2, y2); } //画验证码字符串 for ( int i = 0; i < chkCode.Length; i++) { string fnt = font[rnd.Next(font.Length)]; Font ft = new Font(fnt, fontSize); Color clr = color[rnd.Next(color.Length)]; g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), ( float )i * 18 + 2, ( float )0); } //画噪点 for ( int i = 0; i < 100; i++) { int x = rnd.Next(bmp.Width); int y = rnd.Next(bmp.Height); Color clr = color[rnd.Next(color.Length)]; bmp.SetPixel(x, y, clr); } //清除该页输出缓存,设置该页无缓存 context.Response.Buffer = true ; context.Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0); context.Response.Expires = 0; context.Response.CacheControl = "no-cache" ; context.Response.AppendHeader( "Pragma" , "No-Cache" ); //将验证码图片写入内存流,并将其以 "image/Png" 格式输出 MemoryStream ms = new MemoryStream(); try { bmp.Save(ms, ImageFormat.Png); context.Response.ClearContent(); context.Response.ContentType = "image/Png" ; context.Response.BinaryWrite(ms.ToArray()); } finally { //显式释放资源 bmp.Dispose(); g.Dispose(); } } public bool IsReusable { get { return false ; } } } |
基本验证生成代码demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Web; public partial class image : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { string tmp = RndNum(4); HttpCookie a = new HttpCookie( "ImageV" , tmp); Response.Cookies.Add(a); this .ValidateCode(tmp); } private void ValidateCode( string VNum) { Bitmap Img = null ; Graphics g = null ; MemoryStream ms = null ; int gheight = VNum.Length * 12; Img = new Bitmap(gheight, 25); g = Graphics.FromImage(Img); //背景颜色 g.Clear(Color.White); //文字字体 Font f = new Font( "Arial Black" , 10); //文字颜色 SolidBrush s = new SolidBrush(Color.Black); g.DrawString(VNum, f, s, 3, 3); ms = new MemoryStream(); Img.Save(ms, ImageFormat.Jpeg); Response.ClearContent(); Response.ContentType = "image/Jpeg" ; Response.BinaryWrite(ms.ToArray()); g.Dispose(); Img.Dispose(); Response.End(); } private string RndNum( int VcodeNum) { string Vchar = "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,v,w,x,y,z" ; string [] VcArray = Vchar.Split( new Char[] { ',' }); string VNum = "" ; int temp = -1; Random rand = new Random(); for ( int i = 1; i < VcodeNum + 1; i++) { if (temp != -1) { rand = new Random(i * temp * unchecked (( int )DateTime.Now.Ticks)); } int t = rand.Next(35); if (temp != -1 && temp == t) { return RndNum(VcodeNum); } temp = t; VNum += VcArray[t]; } return VNum; } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。