开发C#生成漂亮验证码的完整攻略可以包括如下几个方面:
1.添加NuGet包
首先要讲解的是,我们需要在项目中添加一个NuGet包来生成验证码。在Visual Studio中,可以通过依次单击“工具”>“NuGet包管理器”>“管理解决方案的NuGet包”来打开NuGet包管理器。然后搜索“ZKWeb.System.Drawing”包并安装它。
2.创建验证码生成类
接下来我们需要创建一个名为“CaptchaHelper”的类。这个类需要定义以下三个公共方法:
public byte[] GenerateCaptcha(string captchaText);
public bool ValidateCaptcha(string captchaText, string captchaCode);
public void ClearExpiredCaptcha();
GenerateCaptcha
方法用于生成验证码,参数“captchaText”用于设置验证码文本。
ValidateCaptcha
方法用于验证验证码是否正确,参数“captchaText”用于指定验证文本,“captchaCode”用于指定验证码编码。
ClearExpiredCaptcha
方法用于清除过期的验证码。
3.实现验证码生成和验证逻辑
在CaptchaHelper类中,代码如下:
public class CaptchaModel
{
public string CaptchaCode { get; set; }
public DateTime ExpireTime { get; set; }
}
public class CaptchaHelper
{
private static readonly IDictionary<string, CaptchaModel> CaptchaDic = new Dictionary<string, CaptchaModel>();
public byte[] GenerateCaptcha(string captchaText)
{
// 生成验证码图片
Image captchaImg = GenerateCaptchaImage(captchaText);
// 将图片转换成字节数组
byte[] imageBytes;
using (var ms = new MemoryStream())
{
captchaImg.Save(ms, ImageFormat.Png);
ms.Seek(0, SeekOrigin.Begin);
imageBytes = ms.ToArray();
}
// 保存验证码
string captchaId = Guid.NewGuid().ToString("N");
var captchaModel = new CaptchaModel
{
CaptchaCode = captchaText,
ExpireTime = DateTime.Now.AddMinutes(5)
};
CaptchaDic[captchaId] = captchaModel;
return imageBytes;
}
public bool ValidateCaptcha(string captchaText, string captchaCode)
{
// 判断验证码是否过期或已经验证过
var captchaModel = CaptchaDic.Values.FirstOrDefault(cm => cm.CaptchaCode == captchaText && DateTime.Now < cm.ExpireTime);
if (captchaModel == null)
{
return false;
}
// 删除已验证过的验证码
CaptchaDic.Remove(CaptchaDic.First(d => d.Value == captchaModel).Key);
return captchaModel.CaptchaCode.ToLowerInvariant() == captchaCode.ToLowerInvariant();
}
public void ClearExpiredCaptcha()
{
var expiredCaptchaList = CaptchaDic.Values.Where(cm => DateTime.Now >= cm.ExpireTime).ToList();
foreach (var captchaModel in expiredCaptchaList)
{
CaptchaDic.Remove(CaptchaDic.First(d => d.Value == captchaModel).Key);
}
}
private Image GenerateCaptchaImage(string captchaText)
{
// 创建一个位图并设置大小
var bmp = new Bitmap(130, 40);
// 创建一个画布对象
var g = Graphics.FromImage(bmp);
// 绘制验证码背景图案
g.Clear(Color.White);
Random rand = new Random();
for (int i = 0; i < 10; i++)
{
int x1 = rand.Next(bmp.Width / 2);
int y1 = rand.Next(bmp.Height);
int x2 = rand.Next(bmp.Width / 2, bmp.Width);
int y2 = rand.Next(bmp.Height);
g.DrawLine(Pens.LightGray, x1, y1, x2, y2);
}
// 绘制验证码文本
Brush brush = new LinearGradientBrush(new Rectangle(0, 0, bmp.Width, bmp.Height), Color.DarkBlue, Color.DarkRed, 1.0f);
g.DrawString(captchaText, new Font("Microsoft Yahei", 20), brush, new PointF(0, 0));
// 添加干扰点和干扰线
for (int i = 0; i < 100; i++)
{
int x = rand.Next(bmp.Width);
int y = rand.Next(bmp.Height);
bmp.SetPixel(x, y, Color.FromArgb(rand.Next()));
}
for (int i = 0; i < 10; i++)
{
int x1 = rand.Next(bmp.Width);
int y1 = rand.Next(bmp.Height);
int x2 = rand.Next(bmp.Width);
int y2 = rand.Next(bmp.Height);
g.DrawLine(Pens.LightGray, x1, y1, x2, y2);
}
return bmp;
}
}
CaptchaModel
类是一个验证码的实体类,包含验证码的代码和过期时间。
GenerateCaptcha
方法通过调用GenerateCaptchaImage
方法生成验证码图片,将验证码图片转换为字节流,并将验证码信息存入字典中。
ValidateCaptcha
方法根据传入的验证文本和验证码编码,判断验证码是否正确。如果过期或验证过,则返回false。
ClearExpiredCaptcha
方法用于清除过期的验证码。
GenerateCaptchaImage
方法用于生成验证码图片,包括绘制背景图案、绘制验证码文本和添加干扰点和干扰线。
4.测试验证码生成和验证
在Web应用程序中,调用GenerateCaptcha
方法生成验证码图片,将验证码图片返回到浏览器,并将验证码代码存储在Session或Cookie中,以便后续的验证。
在验证码输入页面中,用户输入验证码后,调用ValidateCaptcha
方法进行验证。如果验证码正确,则允许用户执行后续操作。
例如,在ASP.NET Core中,可以编写如下代码:
生成验证码:
[HttpGet]
public IActionResult CaptchaImage()
{
string captchaText = "ABCD1234";
byte[] imageData = new CaptchaHelper().GenerateCaptcha(captchaText);
HttpContext.Session.SetString("CaptchaText", captchaText);
return File(imageData, "image/png");
}
验证验证码:
[HttpPost]
public IActionResult Submit(string captchaCode)
{
string captchaText = HttpContext.Session.GetString("CaptchaText");
bool isCaptchaValid = new CaptchaHelper().ValidateCaptcha(captchaText, captchaCode);
if (isCaptchaValid)
{
// 验证成功
return RedirectToAction("Success");
}
else
{
// 验证失败
return RedirectToAction("Error");
}
}
以上是验证码生成和验证的例子。具体实现方式可以根据需求做出调整。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#生成漂亮验证码完整代码类 - Python技术站