《2022年WEB复杂验证码实现 .pdf》由会员分享,可在线阅读,更多相关《2022年WEB复杂验证码实现 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、enumCodeType 数字 = 1, 英文, 中文 CodeType type = CodeType.数字; protectedvoid Page_Load(object sender, EventArgs e) string codes = CreateCode(4); Sessionseed = codes; CreateImg(codes); / /字符工厂 , 生成对应长度的字符串/ / / privatestring CreateCode( int length) Random ran = new Random (); string codeStr = string .Empty
2、; switch (type) case CodeType. 数字: for ( int i = 0; i length; i+) codeStr += (char)ran.Next(48, 57).ToString(); CreateImg(codeStr); return codeStr; case CodeType . 英文: for ( int i = 0; i length; i+) codeStr += (char)ran.Next(65, 91).ToString(); CreateImg(codeStr); return codeStr; case CodeType . 中文:
3、 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - Encoding gb = Encoding.GetEncoding( gb2312 ); / 调用函数产生 4个随机中文汉字编码object bytes = CreateRegionCode(length); for ( int i = 0; i length; i+) / 根据汉字编码的字节数组解码出中文汉字 codeStr += gb.GetString(byte ) Co
4、nvert .ChangeType(bytesi, typeof ( byte ); CreateImg(codeStr); return codeStr; default : returnnull ; / /根据产生的字符串绘制图片/ /需要绘制到图片上的字符串 privatevoid CreateImg( string code) Bitmap bmp = null ; / 字符像素大小不一样在此创建长度不同的bmp if (type = CodeType.数字) bmp = newBitmap( int ) Math.Ceiling(code.Length * 9.5) + 10, 22
5、); elseif (type = CodeType.英文) bmp = new Bitmap( int ) Math.Ceiling(code.Length * 12.5) + 10, 22); else bmp = new Bitmap( int ) Math.Ceiling(code.Length * 20.5) + 10, 22); Graphics g = Graphics.FromImage(bmp); try 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共
6、5 页 - - - - - - - - - / 生成随机生成器Random random = new Random (); / 清空图片背景色 g.Clear(Color.White); / 画图片的干扰线for ( int i = 0; i 5; i+) int x1 = random.Next(bmp.Width); int x2 = random.Next(bmp.Width); int y1=random .Next (bmp .Height ); int y2 = random.Next(bmp.Height); g.DrawLine(new Pen(Color.Silver), x
7、1, y1, x2, y2); Font font = new Font( Arial, 12, (FontStyle.Bold | FontStyle.Italic); / 线性渐变 LinearGradientBrush brush = newLinearGradientBrush(newRectangle(0, 0, bmp.Width, bmp.Height), Color.Blue, Color.DarkRed, 1.2f, true ); g.DrawString(code, font, brush, 3, 2); / 画图片的前景干扰点for ( int i = 0; i 5;
8、i+) int x = random.Next(bmp.Width); int y = random.Next(bmp.Height); bmp.SetPixel(x, y, Color.FromArgb(random.Next(); / 画图片的边框线 g.DrawRectangle(new Pen(Color.Silver), 0, 0, bmp.Width - 1, bmp.Height - 1); System.IO.MemoryStream ms = newSystem.IO. MemoryStream (); bmp.Save(ms, System.Drawing.Imaging.
9、ImageFormat.Gif); System.Web.HttpContext.Current.Response.ClearContent(); System.Web.HttpContext.Current.Response.ContentType = image/Gif; System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray(); catch 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页
10、 - - - - - - - - - finally g.Dispose(); bmp.Dispose(); publicobject CreateRegionCode(int strlength) / 定义一个字符串数组储存汉字编码的组成元素string rBase = new String 16 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , a , b , c , d , e , f ; Random rnd = new Random (); / 定义一个 object 数组用来object bytes = new object strlength; /*
11、/ /* 每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject 数组中每个汉字有四个区位码组成区位码第 1位和区位码第 2位作为字节数组第一个元素区位码第 3位和区位码第 4位作为字节数组第二个元素 */ for ( int i = 0; i strlength; i+) / 区位码第 1位int r1 = rnd.Next(11, 14); string str_r1 = rBaser1.Trim(); / 区位码第 2位 rnd = newRandom (r1 * unchecked( int ) DateTime.Now.Ticks) + i);/ 更换随机数发生器的种子
12、避免产生重复值int r2; if (r1 = 13) r2 = rnd.Next(0, 7); else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - r2 = rnd.Next(0, 16); string str_r2 = rBaser2.Trim(); / 区位码第 3位 rnd = newRandom (r2 * unchecked( int ) DateTime.Now.Ticks) + i); int r3 =
13、rnd.Next(10, 16); string str_r3 = rBaser3.Trim(); / 区位码第 4位 rnd = newRandom (r3 * unchecked( int ) DateTime.Now.Ticks) + i); int r4; if (r3 = 10) r4 = rnd.Next(1, 16); elseif (r3 = 15) r4 = rnd.Next(0, 15); else r4 = rnd.Next(0, 16); string str_r4 = rBaser4.Trim(); / 定义两个字节变量存储产生的随机汉字区位码byte byte1 =
14、 Convert .ToByte(str_r1 + str_r2, 16); byte byte2 = Convert .ToByte(str_r3 + str_r4, 16); / 将两个字节变量存储在字节数组中byte str_r = new byte byte1, byte2 ; / 将产生的一个汉字的字节数组放入object 数组中 bytes.SetValue(str_r, i); return bytes; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -