首页 > 编程语言 >C# 验证码的简单生成,登录实现校验验证码

C# 验证码的简单生成,登录实现校验验证码

时间:2023-08-28 11:47:08浏览次数:36  
标签:C# 验证码 bitmap int Color new 校验 Next

登录实现校验验证码

1、思路:首先写一个生成验证码的接口,接口传出就是验证码的唯一id和验证码图片的base64, 把验证码的id当做缓存的key,再把生成的验证码code当做值存到缓存中。

2、登录:输入用户名、密码、验证码唯一id和用户输入的验证码值。用验证码唯一id获取到缓存中的验证码值,再和用户输入的值相比较。。就简单实现了

3、验证码生成代码

 1  public class VerifyCodeHelper
 2  {
 3      public static string BuildCode(out string code)
 4      {
 5          code = string.Empty;
 6          Random rand = new Random();
 7          Bitmap bitmap = new Bitmap(85, 30);//设置宽高
 8          Graphics graphics = Graphics.FromImage(bitmap);//生成画布
 9          graphics.Clear(Color.White);//清空画布
10 
11          string letters = "023456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";//去除 1 I l 
12          Random random = new Random();
13          //生成四位验证码
14          for (int i = 0; i < 4; i++)
15          {
16              code += letters[random.Next(0, letters.Length)];
17          }
18 
19          //画5条干扰线
20          for (int i = 0; i < 5; i++)
21          {
22              int x1 = random.Next(bitmap.Width);
23              int y1 = random.Next(bitmap.Height);
24              int x2 = random.Next(bitmap.Width);
25              int y2 = random.Next(bitmap.Height);
26              graphics.DrawLine(new Pen(Color.Coral), x1, y1, x2, y2);
27          }
28          //画150个干扰点
29          for (int i = 0; i < 150; i++)
30          {
31              int x1 = random.Next(bitmap.Width);
32              int y1 = random.Next(bitmap.Height);
33              bitmap.SetPixel(x1, y1, Color.FromArgb(random.Next()));//随机颜色填充
34          }
35          //画个边框
36          graphics.DrawRectangle(new Pen(Color.Black), new Rectangle(0, 0, bitmap.Width - 1, bitmap.Height - 1));
37 
38          int randAngle = 45;//随机转动角度 //验证码旋转,防止机器识别
39          char[] chars = code.ToCharArray();//拆散字符串成单字符数组
40          //文字居中
41          StringFormat format = new StringFormat(StringFormatFlags.NoClip);
42          format.Alignment = StringAlignment.Center;
43          format.LineAlignment = StringAlignment.Center;
44          //定义颜色
45          Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
46          //定义字体
47          string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
48          for (int i = 0; i < chars.Length; i++)
49          {
50              int cindex = rand.Next(7);
51              int findex = rand.Next(5);
52              //字体样式(参数2为字体大小)
53              Font f = new System.Drawing.Font(font[findex], 13, System.Drawing.FontStyle.Bold);
54              Brush b = new System.Drawing.SolidBrush(c[cindex]);
55              Point dot = new Point(16, 16);
56 
57              float angle = rand.Next(-randAngle, randAngle);//转动的度数
58              graphics.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
59              graphics.RotateTransform(angle);
60              graphics.DrawString(chars[i].ToString(), f, b, 1, 1, format);
61 
62              graphics.RotateTransform(-angle);//转回去
63              graphics.TranslateTransform(2, -dot.Y);//移动光标到指定位置
64          }
65          string strbaser64 = string.Empty;
66          using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
67          {
68              bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
69              byte[] arr = new byte[stream.Length];
70              stream.Position = 0;
71              stream.Read(arr, 0, (int)stream.Length);
72              strbaser64 = Convert.ToBase64String(arr);
73          }
74          return strbaser64;
75      }
76  }

 

标签:C#,验证码,bitmap,int,Color,new,校验,Next
From: https://www.cnblogs.com/heidashuaiGo/p/17661878.html

相关文章

  • normalizeKey is not a function #element #vue #疑难杂症
    normalizeKeyisnotafunction#element#vue#疑难杂症原因是组件中使用了import{Search}from'@element-plus/icons-vue'解决方案是,在main.ts中,将Vue的引入置顶。 //TOP import{createApp}from'vue' importAppfrom'./App.vue&......
  • python使用docx向word文档中表格插入图片并固定缩放
    使用python的docx模块对word文档进行编辑时,有时候需要向表格中插入图片,但是插入的图片一般是按照原图片的大小插入的,即使你的word文档一开始就设置好了固定宽高,似乎也是不起作用,这个时候就需要在插入后,用python去调整图片的宽高。示例代码:fromdocximportDocumentfromdocxi......
  • 优雅的对旋转编码器消抖(EC11,正交)
    环境:STM32SDK:Arduino(烧录了Arduino的bootloader)旋转编码器:EC11此处只处理正交编码器的A,B。在网上随意找的一个截图事宜,观看此图后,默认各位了解EC11的工作逻辑。  消抖的核心思路:A脚设置为上升下降沿均会进中断,下降上升一个变换周期,判断这个周期的A脚,B脚的始末状......
  • Docker搭建本地私有仓库
    一、拉取Registry镜像dockerpullregistry二、运行registry容器dockerrun-d-p5000:5000-v/langren/myreqistry:/tmp/reqistry--privileged=true--namemyreqistryregistry三、发送get请求验证镜像库是否正常运行curl-XGEThttp://10.10.10.12:5000/v2/_catalog四、配置......
  • 各按键对应keycode一览表
    keycode   8=BackSpaceBackSpacekeycode   9=TabTabkeycode  12=Clearkeycode  13=Enterkeycode  16=Shift_Lkeycode  17=Control_Lkeycode  18=Alt_Lkeycode  19=Pausekeycode  20=Caps_Lockkeycode  27=EscapeEscapeke......
  • Lucene:基于Java的全文检索引擎简介
    Lucene是一个基于Java的全文索引工具包。基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史全文检索的实现:Luene全文索引和数据库索引的比较中文切分词机制简介:基于词库和自动切分词算法的比较具体的安装和使用简介:系统结构介绍和演示HackingLucene:简化的查询分析器,删......
  • oracle数据库中插入特殊符号'&'
    在plsql里边执行:updateuserinfosetpageurl='myjsp?page=1&pagesize=10'whereid='test'这条sql语句往数据库的pageurl字段放进去了一个url地址,但是执行的时候却并非那么理想,因为这其中有一个oracle的特殊字符,需要进行转义,那就是字符'&'.怎么处理上例中的特殊字符?两个办法:  ......
  • Tomcat使用GZip压缩网页数据
    这个技术旨将在服务端需要输出到客户端的数据信息使用Gzip方式进行压缩,然后再传输到客户端,客户端接收到数据后会自动解压并输出,它的好处是可以减少网页下载的数据量,降低网络负载,提高网页输出到客户端的速度,而Gzip技术几乎是目前所有浏览器都支持的,包括IE6。 找到tomcat/conf/serve......
  • 理解ORACLE数据库字符集
    一.引言   ORACLE数据库字符集,即Oracle全球化支持(GlobalizationSupport),或即国家语言支持(NLS)其作用是用本国语言和格式来存储、处理和检索数据。利用全球化支持,ORACLE为用户提供自己熟悉的数据库母语环境,诸如日期格式、数字格式和存储序列等。Oracle可以支持多种语言及字符集,......
  • MyEclipse中使用复制粘贴功能卡的解决办法
    最近在MyEclipse中编辑代码时,使用快捷键进行复制粘贴,经常会导致编辑器短暂的停顿,光标不跟随,居然反应不过来,几近假死。想来想去应该是编辑上的什么配置或者是IDE的什么功能导致,于是进入Preferences查找edit功能,进行一个个的测试,最后发现原来是代码的超链功能导致。 进入方法:Window......