.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 ...
随机推荐
- python之Djiango框架简介
基础 # HTTP响应状态码 10X:服务端已经接受到你的数据了 你可以继续提交数据进行下一步操作 20X:请求成功(200) 30X:重定向(301,302) 40X:请求错误(404) 50X:服 ...
- openpyxl模块操作Excel
1.openpyxl模块了解 1.excel版本问题 03版本之前的excel文件后缀名xls 03版本之后的excel文件后缀名xlsx 2.python操作excel表格的模块 openpyxl ...
- 03.Java 基础语法
1. 注释.标识符.关键字 三种注释 单行注释:// 多行注释:/* 多行注释 */ 文档注释: /** * @Description HelloWorld * @Author xxx */ 标识符 ...
- 分享一张2020年用jaegertracing画的tomcat8.5启动流程图
今天整理电脑的时候意外发现一张tomcat8.5的启动流程图,是笔者2020年借助jaegertracing绘制的,想想还比较有意思,在这里分享一下,当初闲来无事折腾了小半天,具体过程已经是记不起来了 ...
- Phpstrom开发工具Sftp的使用
- python教程6.1-模块和包
模块分类 1.内置标准模块(⼜称标准库)执⾏help('modules')查看所有python⾃带模块列表 2.第三⽅开源模块,可通过pip install 模块名 联⽹安装 3.⾃定义模块 模块导入 ...
- windows 10安装python2.7
一.官网下载 1.百度搜索"python"或者点击这个网址下载https://www.python.org/downloads/release/python-2716/ pytho ...
- 基于Vue3水印组件封装:防篡改守护!
基于Vue 3的全新水印通用组件.这款组件不仅功能强大,而且易于集成,能够轻松为您的网页或应用添加自定义水印,有效防止内容被篡改或盗用. 在线查看效果: 原文可查看效果地址 一,编写watermark ...
- 内网渗透 Metasploit(MSF)基础使用
免责申明 以下内容仅供学习使用,非法使用造成的问题由使用人承担 攻击思路 漏洞探测(信息收集) <- fsacn,namp | 漏洞利用 <- 工具(msf等) | 获取服务器权限 MSF ...
- Stable Diffusion 术语表
Stable Diffusion 术语表 说明 原文地址:https://theally.notion.site/The-Definitive-Stable-Diffusion-Glossary-1d ...