基于Asp.Net Core 生成验证码
一、生成指定长度字符
/// <summary>
/// 生成code
/// </summary>
/// <param name="len"></param>
/// <returns></returns>
private static string CreateValidateCode(int len)
{
// 设置允许出现的字符
string charStrs = "dsadfjlwepqsdfkfhdkasrxfownds34566451346";
Random random = new Random();
// 通过随机数生成code
string code = String.Empty;
for (int i = 0; i < len; i++)
{
code += charStrs[random.Next(charStrs.Length)];
}
return code;
}
二、生成并存储
/// <summary>
/// 生成code并提供两种方式存储 建议采用字节流存储
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
private static Byte[] GenerateCode(string code)
{
// 创建画板 设置宽度和高度
Bitmap bitmap = new Bitmap(code.Length*24, 30);
// 创建画笔
Graphics graphics = Graphics.FromImage(bitmap);
// 给画布涂上背景
graphics.Clear(Color.White);
// 设置颜料板和调色刷
RectangleF rectangleF = new RectangleF(0, 0, bitmap.Width, bitmap.Height);
LinearGradientBrush linearGradientBrush = new LinearGradientBrush(rectangleF, Color.Red, Color.DarkBlue, 1.2f, true);
// 设置需要画到图中文字的格式(字体,大小,是否加粗,斜体)
Font font = new Font("Consolas", 16, FontStyle.Bold | FontStyle.Italic);
// 将 文字画到面板上
graphics.DrawString(code, font, linearGradientBrush, 0, 0);
// 存储验证码
#region 存储法一 路径存储
//bitmap.Save(AppDomain.CurrentDomain.BaseDirectory + "code.jpg");
#endregion
#region 存储法二 字节流存储
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Jpeg);
return stream.ToArray();
}
#endregion
}
返回给前端
public IActionResult GetCode()
{
string codeStr = CreateValidateCode(4);
byte[] buffer= GenerateCode(codeStr);
// 获取访问IP
string ip = HttpContext.Connection.RemoteIpAddress.ToString();
//MemoryCacheHelper.SetCache(ip, codeStr); // 将code缓存到对应ip 可选择不用
return File(buffer, @"image/png");
}
PS:学习笔记基于B站up主-全栈ACE 的教程
B站链接