ASP.NET 漂亮美观的验证码
1.随机码和图片流生成
public class ValidateCode { /// <summary> /// 產生圖形驗證碼。 /// </summary> /// <param name="Code">傳出驗證碼。</param> /// <param name="CodeLength">驗證碼字元數。</param> /// <param name="Width"></param> /// <param name="Height"></param> /// <param name="FontSize"></param> /// <returns></returns> public static byte[] CreateValidateGraphic(out String Code, int CodeLength, int Width, int Height, int FontSize) { String sCode = String.Empty; //顏色列表,用於驗證碼、噪線、噪點 Color[] oColors ={ System.Drawing.Color.Black, System.Drawing.Color.Red, System.Drawing.Color.Blue, System.Drawing.Color.Green, System.Drawing.Color.Orange, System.Drawing.Color.Brown, System.Drawing.Color.Brown, System.Drawing.Color.DarkBlue }; //字體列表,用於驗證碼 string[] oFontNames = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" }; //驗證碼的字元集,去掉了一些容易混淆的字元 char[] oCharacter = { '2','3','4','5','6','8','9', 'A','B','C','D','E','F','G','H','J','K', 'L','M','N','P','R','S','T','W','X','Y' }; Random oRnd = new Random(); Bitmap oBmp = null; Graphics oGraphics = null; int N1 = 0; System.Drawing.Point oPoint1 = default(System.Drawing.Point); System.Drawing.Point oPoint2 = default(System.Drawing.Point); string sFontName = null; Font oFont = null; Color oColor = default(Color); //生成驗證碼字串 for (N1 = 0; N1 <= CodeLength - 1; N1++) { sCode += oCharacter[oRnd.Next(oCharacter.Length)]; } oBmp = new Bitmap(Width, Height); oGraphics = Graphics.FromImage(oBmp); oGraphics.Clear(System.Drawing.Color.White); try { for (N1 = 0; N1 <= 4; N1++) { //畫噪線 oPoint1.X = oRnd.Next(Width); oPoint1.Y = oRnd.Next(Height); oPoint2.X = oRnd.Next(Width); oPoint2.Y = oRnd.Next(Height); oColor = oColors[oRnd.Next(oColors.Length)]; oGraphics.DrawLine(new Pen(oColor), oPoint1, oPoint2); } float spaceWith = 0, dotX = 0, dotY = 0; if (CodeLength != 0) { spaceWith = (Width - FontSize * CodeLength - 10) / CodeLength; } for (N1 = 0; N1 <= sCode.Length - 1; N1++) { //畫驗證碼字串 sFontName = oFontNames[oRnd.Next(oFontNames.Length)]; oFont = new Font(sFontName, FontSize, FontStyle.Italic); oColor = oColors[oRnd.Next(oColors.Length)]; dotY = (Height - oFont.Height) / 2 + 2;//中心下移2像素 dotX = Convert.ToSingle(N1) * FontSize + (N1 + 1) * spaceWith; oGraphics.DrawString(sCode[N1].ToString(), oFont, new SolidBrush(oColor), dotX, dotY); } for (int i = 0; i <= 30; i++) { //畫噪點 int x = oRnd.Next(oBmp.Width); int y = oRnd.Next(oBmp.Height); Color clr = oColors[oRnd.Next(oColors.Length)]; oBmp.SetPixel(x, y, clr); } Code = sCode; //保存图片数据 MemoryStream stream = new MemoryStream(); oBmp.Save(stream, ImageFormat.Jpeg); //输出图片流 return stream.ToArray(); } finally { oGraphics.Dispose(); } } }
图片流以图片的形式响应到页面
public class ValidateCodeController : Controller { public ActionResult GetImg() { int width = ConverterHelper.ObjToInt(Request.Params["width"], 100); int height = ConverterHelper.ObjToInt(Request.Params["height"], 40); int fontsize = ConverterHelper.ObjToInt(Request.Params["fontsize"], 20); string code = string.Empty; byte[] bytes = ValidateCode.CreateValidateGraphic(out code, 4, width, height, fontsize); SessionHelper.SetValiCode(code); return File(bytes, @"image/jpeg"); } }
页面显示及刷新(img+js)
<img id="GL_StandardCode" style="cursor: pointer;" src="@Url.Action("GetImg", "ValidateCode")?t=@DateTime.Now.Ticks" title="看不清,点击换一张" /> $("#GL_StandardCode").click(function () { var newSrc = "@Url.Action("GetImg", "ValidateCode")" + "?t=" + (new Date()).getTime(); this.src=newSrc; return false; });
登录时判断SESSION值
string pCode = Request.Params["GL_CodeInput"]; string sCode = SessionHelper.GetValiCode(); if (string.IsNullOrEmpty(pCode)) { resultMsg = "请输入验证码"; } else if (string.IsNullOrEmpty(sCode)) { resultMsg = "验证码过期"; } else if (pCode.ToLower() != sCode.ToLower()) { resultMsg = "验证码不正确"; }
作者: Homegu
出处:https://www.cnblogs.com/codedisco/p/12540639.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。
觉得文章不错,点个关注呗!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理