c#实现验证码功能
c#实现验证码功能
一、验证码简介
验证码功能一般是用于防止批量注册的,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或字母或符号或文字,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
常见的验证码有如下几种:
1、纯数字验证码,一般为四位随机数字;
2、数字+字母验证码,一般从数字(0~9)和字母(A~Z和a~z)中随机抽出几个字符组成;
3、汉字验证码,相对而言,这种验证码比较少见一点,实现起来也相对复杂一些,但在不少网站中还是可以看到的;
二、验证码的实现
1、纯数字验证码的实现
纯数字验证码的实现相对比较简单,可通过以下两种方法来实现
/// <summary> /// 数字验证码 /// </summary> /// <param name="codeCount">验证码的位数‘n’</param> /// <returns>返回‘n’位验证码的字符串</returns> private static String GetRandomint(int codeCount) { Random random = new Random(); StringBuilder sbmin = new StringBuilder(); StringBuilder sbmax = new StringBuilder(); for (int i = 0; i < codeCount; i++) { sbmin.Append("1"); sbmax.Append("9"); } return random.Next(Convert.ToInt32(sbmin.ToString()), Convert.ToInt32(sbmax.ToString())).ToString(); }
2、数字与字母组合字符串
字母与数字组合的字符串也比较简单 可以按照自己的规则去生成大小写字母
/// <summary> /// 生成验证码字符串 /// </summary> /// <param name="codeLen">验证码字符长度</param> /// <returns>返回验证码字符串</returns> private static string MakeCode(int codeLen) { if (codeLen < 1) { return string.Empty; } int number; StringBuilder sbCheckCode = new StringBuilder(); Random random = new Random(); for (int index = 0; index < codeLen; index++) { number = random.Next(); if (number % 2 == 0) { sbCheckCode.Append((char)('0' + (char)(number % 10))); //生成数字 } else { sbCheckCode.Append((char)('A' + (char)(number % 26))); //生成字母 } } return sbCheckCode.ToString(); }
3、生成图片流
原理:先生成验证码,然后把生成的验证码转化为图片流进行输出
///<summary> /// 获取验证码图片流 /// </summary> /// <param name="checkCode">验证码字符串</param> /// <returns>返回验证码图片流</returns> public static MemoryStream CreateCodeImg(string checkCode) { if (string.IsNullOrEmpty(checkCode)) { return null; } Bitmap image = new Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22); Graphics graphic = Graphics.FromImage(image); try { Random random = new Random(); graphic.Clear(Color.White); int x1 = 0, y1 = 0, x2 = 0, y2 = 0; for (int index = 0; index < 25; index++) { x1 = random.Next(image.Width); x2 = random.Next(image.Width); y1 = random.Next(image.Height); y2 = random.Next(image.Height); graphic.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); } Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic)); System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Red, Color.DarkRed, 1.2f, true); graphic.DrawString(checkCode, font, brush, 2, 2); int x = 0; int y = 0; //画图片的前景噪音点 for (int i = 0; i < 100; i++) { x = random.Next(image.Width); y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //画图片的边框线 graphic.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); //将图片验证码保存为流Stream返回 System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); return ms; } finally { graphic.Dispose(); image.Dispose(); } }
调用方法
在HttpHander的ProcessRequest中进行调用: pupublic void ProcessRequest(HttpContext context) { string code = MakeCode(5); context.Response.ClearContent(); context.Response.ContentType = "image/Gif"; MemoryStream ms = CreateCodeImg(code); if (null != ms) { context.Response.BinaryWrite(ms.ToArray()); } }
漫思
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2022-02-21 Ant Design Mobile 5.0 来了
2022-02-21 2021年值得推荐的3个React动画库及思考
2022-02-21 15个有用的React动画库,马上让你的项目变得高大上
2022-02-21 ES6rest运算符
2020-02-21 vscode 方法代码块的注释生成方法
2020-02-21 VSCode打开webpack项目,无法对@指向的文件使用“转到定义”,怎么办?
2020-02-21 ES6 @与..