.NET Core 中生成验证码
在开发中,有时候生成验证码的场景目前还是存在的,本篇演示不依赖第三方组件,生成随机验证码图片。
先添加验证码接口
public interface ICaptcha
{
/// <summary>
/// 生成随机验证码
/// </summary>
/// <param name="codeLength"></param>
/// <returns></returns>
Task<string> GenerateRandomCaptchaAsync(int codeLength = 4); /// <summary>
/// 生成验证码图片
/// </summary>
/// <param name="captchaCode">验证码</param>
/// <param name="width">宽为0将根据验证码长度自动匹配合适宽度</param>
/// <param name="height">高</param>
/// <returns></returns>
Task<CaptchaResult> GenerateCaptchaImageAsync(string captchaCode, int width = 0, int height = 30);
}
验证码返回模型
public class CaptchaResult
{
/// <summary>
/// CaptchaCode
/// </summary>
public string CaptchaCode { get; set; } /// <summary>
/// CaptchaMemoryStream
/// </summary>
public MemoryStream CaptchaMemoryStream { get; set; } /// <summary>
/// Timestamp
/// </summary>
public DateTime Timestamp { get; set; }
}
接下来实现接口,主要是依赖微软的System.Drawing.Common组件,注意命名空间的引用
public class Captcha : ICaptcha
{
private const string Letters = "1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z"; public Task<CaptchaResult> GenerateCaptchaImageAsync(string captchaCode, int width = 0, int height = 30)
{
//验证码颜色集合
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; //验证码字体集合
string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial" }; //定义图像的大小,生成图像的实例
var image = new Bitmap(width == 0 ? captchaCode.Length * 25 : width, height); var g = Graphics.FromImage(image); //背景设为白色
g.Clear(Color.White); var random = new Random(); for (var i = 0; i < 100; i++)
{
var x = random.Next(image.Width);
var y = random.Next(image.Height);
g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
} //验证码绘制在g中
for (var i = 0; i < captchaCode.Length; i++)
{
//随机颜色索引值
var cindex = random.Next(c.Length); //随机字体索引值
var findex = random.Next(fonts.Length); //字体
var f = new Font(fonts[findex], 15, FontStyle.Bold); //颜色
Brush b = new SolidBrush(c[cindex]); var ii = 4;
if ((i + 1) % 2 == 0)
ii = 2; //绘制一个验证字符
g.DrawString(captchaCode.Substring(i, 1), f, b, 17 + (i * 17), ii);
} var ms = new MemoryStream();
image.Save(ms, ImageFormat.Png); g.Dispose();
image.Dispose(); return Task.FromResult(new CaptchaResult
{
CaptchaCode = captchaCode,
CaptchaMemoryStream = ms,
Timestamp = DateTime.Now
});
} public Task<string> GenerateRandomCaptchaAsync(int codeLength = 4)
{
var array = Letters.Split(new[] { ',' }); var random = new Random(); var temp = -1; var captcheCode = string.Empty; for (int i = 0; i < codeLength; i++)
{
if (temp != -1)
random = new Random(i * temp * unchecked((int)DateTime.Now.Ticks)); var index = random.Next(array.Length); if (temp != -1 && temp == index)
return GenerateRandomCaptchaAsync(codeLength); temp = index; captcheCode += array[index];
} return Task.FromResult(captcheCode);
}
}
在控制器中注入调用
[Route("api/[controller]")]
[ApiController]
public class CaptchaController : ControllerBase
{
[HttpGet]
public async Task<FileContentResult> CaptchaAsync([FromServices] ICaptcha _captcha)
{
var code = await _captcha.GenerateRandomCaptchaAsync();
var result = await _captcha.GenerateCaptchaImageAsync(code);
return File(result.CaptchaMemoryStream.ToArray(), "image/png");
}
}
gitee地址:https://gitee.com/xuzhongye/GenerateVerificationCodeDemo.git
.NET Core 中生成验证码的更多相关文章
- java中生成验证码,以及验证码的使用
java中生成验证码,以及验证码的使用: 1:验证码生成工具类: import java.awt.Color; import java.awt.Font; import java.awt.Graphi ...
- servlet中生成验证码
在servlet中生成验证码 package login; import java.awt.Color; import java.awt.Graphics; import java.awt.image ...
- JAVA WEB项目中生成验证码及验证实例(附源码及目录结构)
[我是一个初学者,自己总结和网上搜索资料,代码是自己敲了一遍,亲测有效,现将所有的目录结构和代码贴出来分享给像我一样的初学者] 作用 验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计 ...
- PHP中生成验证码
//生成图片$im = imagecreatetruecolor(100,30);//生成颜色,当第一次调用生成颜色的方法,是生成背景颜色,默认是黑色//如果想自定义背景颜色,用到imagefill函 ...
- .Net Core 中使用PetaPoco ,T4生成模版
话不多说,直接上源码. 1.引用NuGet 2.添加T4 <#@ template debug="true" hostspecific="false" l ...
- Java生成验证码原理(jsp)
验证码的作用: 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的 ...
- ASP.NET Core中使用表达式树创建URL
当我们在ASP.NET Core中生成一个action的url会这样写: var url=_urlHelper.Action("Index", "Home"); ...
- 详细说说如何生成验证码—ASP.NET细枝末节(4)
前言 今天小编详细的说一下,ASP.NET网站开发过程中生成验证码的全部问题. 本文的目标,是让读者了解,生成验证码涉及的全部基础知识问题. 当然这里说的是比较简单的验证码. 真正符合要求的验证码,涉 ...
- node.js生成验证码及图片
示例代码: var svgCaptcha = require('svg-captcha'); var fs = require('fs'); var codeConfig = { size: 5,// ...
- 务必收藏备用:.net core中通过Json或直接获取图形验证码(数字验证码、字母验证码、混合验证码),有源代码全实战demo(开源代码.net core3.0)
很多人写的博客大家看了会一知半解,不知道怎么用,应该引用什么类库或者代码不全,这样很多小白很是头疼,尤其是尝新技术更是如此.我们这边不止告诉你步骤,而且还提供开源demo.随着时间的推移,我们的dem ...
随机推荐
- dotnet 读 WPF 源代码笔记 WPF 是如何做到一套代码兼容多个 .NET Framework 版本
在 .NET Framework 时代里面,有一组有趣的概念,那就是 SDK 和 Runtime 这两个概念.开发模式十分有趣,在开发者设备上,可以指定 .NET Framework 的 SDK 版本 ...
- dotnet C# 多次对一个对象调用构造函数会发生什么
今天来玩一点变态的,使用反射获取到某个类型的构造函数,接着多次对此类型的某个对象调用构造函数方法.请问此时会发生什么 假定有一个类型 Foo 的定义如下 class Foo : IDisposable ...
- VisualStudio 在 DebuggerDisplay 的属性更改业务逻辑将会让调试和非调试下逻辑不同
本文记录我写的逗比代码,我在 DebuggerDisplay 对应的属性的 get 方法上,在这个方法里面修改了业务逻辑,如修改界面元素,此时我在 VisualStudio 断点调试下和非断点调试下的 ...
- element-ui表单重置函数 resetFields 无效解决
由element-ui文档中能看到重置表单使用的是如下函数 this.$refs[formName].resetFields(); 但是有时使用它却可能会失效 解决: form-item中要加上pro ...
- jqGrid--统计列
//数据表格 <div class="gridPanel" style="width:100%;"> @* 数据表格 *@ <table id ...
- CRAPS赌博小游戏
游戏规则 代码实现 首先把这个规则用代码写出来 再在它基础上进行简单的可视化(主要是利用Easygui的界面) 最后查缺补漏,看看有没有什么Bug 利用pyinstaller -F -w -i xx. ...
- DB2查找最耗时SQL
两种方法:db2top和snapshot for dynamic sql 1. db2top -d <dbname>
- ECMAScript 语言规范每年都会进行一次更新,而备受期待的 ECMAScript 2024 将于 2024 年 6 月正式亮相。目前,ECMAScript 2024 的候选版本已经发布,为我们带来了一系列实用的新功能。
Promise.withResolvers 使用 Promise.withResolvers() 关键的区别在于解决和拒绝函数现在与 Promise 本身处于同一作用域,而不是在执行器中被创建和一次性 ...
- three.js 物体要使用光线投射技术,计算是否点击位置与物体有交叉
原生 DOM 还用原生的 DOM 点击事件,要注意开启 pointerEvents CSS3DRenderer 是一个新的渲染器,需要在渲染循环调用并适配 labelRenderer.domEleme ...
- Shopify Theme 开发 —— 性能优化
一.概述 关于 Shopify Theme 的性能优化,通常有以下几点: 1.卸载未使用的应用程序 有些 app 会在 theme 里面插入一些代码,即使 app 未被使用,也可能会加载一些脚本文件, ...