asp.net不用验证码包,如何实现手写验证码

news2024/11/24 20:05:41

引文:众所周知,一般我们日常碰到的验证码是一个图形样式的,列入这个样子的,那么在这个图片里面我们想实现我们自己界面上有这样的一个验证码就需要做两个操作,一个是在我们自己界面上生成如图所示的一个验证码图片,第二个操作就是将验证码里面的字符和用户输入的字符对比。


首先我们来实现生成 生成验证码的这一部分,这时候我们需要封装一个类,里面有生成图片和字符的方法,其实本质上就是一个随机数,这个类卸载Model里面即可

   public class CaptchaGenerator
    {
        string ocode;
        // 可选字符集合
        string letters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Random random = new Random();

        public string ConductOrginalcode() {
            for (int i = 0; i < 4; i++)
            {
                ocode += letters[random.Next(letters.Length)];
            }
            return ocode;

        }

       

        public string GenerateCaptchaCode()
        { 
            return ocode;
        }
        public string GenerateCaptchaImage()
        {
            // 验证码图片的尺寸
            const int WIDTH = 60;
            const int HEIGHT = 30;

            // 创建Bitmap对象
            Bitmap bitmap = new Bitmap(WIDTH, HEIGHT);
            Graphics graphics = Graphics.FromImage(bitmap);
            graphics.Clear(Color.White);

            // 生成四位验证码
            string code ;

            code = ocode;

            // 绘制干扰线
            for (int i = 0; i < 20; i++)
            {
                int x1 = random.Next(bitmap.Width);
                int y1 = random.Next(bitmap.Height);
                int x2 = random.Next(bitmap.Width);
                int y2 = random.Next(bitmap.Height);
                graphics.DrawLine(new Pen(Color.Coral), x1, y1, x2, y2);
            }

            // 绘制干扰点
            for (int i = 0; i < 200; i++)
            {
                int x = random.Next(bitmap.Width);
                int y = random.Next(bitmap.Height);
                bitmap.SetPixel(x, y, Color.FromArgb(random.Next()));
            }

            // 绘制边框
            graphics.DrawRectangle(new Pen(Color.Black), new Rectangle(0, 0, bitmap.Width - 1, bitmap.Height - 1));

            // 使用渐变画刷填充验证码文本
            LinearGradientBrush linearGradientBrush = new LinearGradientBrush(new Rectangle(0, 0, bitmap.Width, bitmap.Height), Color.Blue, Color.Green, 1.4f);
            graphics.DrawString(code, new Font("宋体", 20), linearGradientBrush, new PointF(0, 0));

            // 将Bitmap转换为MemoryStream,并进一步转换为Base64字符串
            MemoryStream ms = new MemoryStream();
            bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] imageBytes = ms.ToArray();
            ms.Close();


            string base64String = Convert.ToBase64String(imageBytes);
            return base64String;
        }

    }

这个类里面包含了三个方法第一个是生成随机数,第二个是生成字符的,第三个是根据字符来生成对应的图片 

然后我们需要在我们需要的控制器里面调用这个类,用户比较的时候就拿第二个方法里面的字符去比较就可以了

  // GET: GuestBook
        public ActionResult Index(int? page)
        {
            // 生成验证码
            Session.Remove("CaptchaCode");
            CaptchaGenerator captchaGenerator = new CaptchaGenerator();
            captchaGenerator.ConductOrginalcode();
            string captchaBase64 = captchaGenerator.GenerateCaptchaImage();
            string captchaText = captchaGenerator.GenerateCaptchaCode();
            ViewBag.CaptchaImage = $"data:image/jpeg;base64,{captchaBase64}";

            Session["CaptchaCode"] = captchaText;


            int pageIndex = page ?? 2; // 新的初始页码
            int pageSize = 2; // 新的每页大小
            var guestBookQuery = from gb in db.GuestBooks
                                 orderby gb.AddDate descending
                                 select gb;
            /*    Webdiyer.WebControls.Mvc.IPagedList<GuestBook> p1 = new Webdiyer.WebControls.Mvc.PagedList<GuestBook>(guestBookQuery.ToList(), pageIndex, pageSize);*/
            PagedList.IPagedList<GuestBook> p1 = guestBookQuery.ToPagedList(pageIndex, pageSize);
            return View(p1);
        }

 然后需要的是在这个控制器里面我们还要写一个刷新验证码的方法,保证验证码错误和输入正确之后都要刷新一遍.

 private void RefreshCaptcha()
        {

            Session.Remove("CaptchaCode");
            CaptchaGenerator captchaGenerator = new CaptchaGenerator();
            captchaGenerator.ConductOrginalcode();
            string captchaBase64 = captchaGenerator.GenerateCaptchaImage();
            string captchaText = captchaGenerator.GenerateCaptchaCode();

            ViewBag.CaptchaImage = $"data:image/jpeg;base64,{captchaBase64}";
            Session["CaptchaCode"] = captchaText;
        }
   <tr>
        
         <div style="display:flex;margin-left:10px;left:20%">
             <img src="@ViewBag.CaptchaImage" alt="验证码" />
             <input style="margin-left:13px" type="text" name="captcha" />
         </div>
          
      </tr>

在视图里面添加这个关于验证码的

  [HttpPost]
        public ActionResult Index(GuestBook guestBook,string captcha)
        {
            if (Session["CaptchaCode"] != null && captcha != null)
            {
                string captchaSessionValue = Session["CaptchaCode"] as string;
                if (captchaSessionValue == captcha)
                {
                  
                }
                else
                {
                    return Content("<script>alert('验证码输入错误');window.location.href='/GuestBook/Index';</script>");
                }
            }
            RefreshCaptcha();

            int pageSize = 2;

            if (ModelState.IsValid)
            {
                guestBook.AddDate = DateTime.Now;
                db.GuestBooks.Add(guestBook);
                db.SaveChanges();

                ModelState.Clear();
            }

            var guestBookQuery = from gb in db.GuestBooks
                                 orderby gb.AddDate descending
                                 select gb;

            PagedList.IPagedList<GuestBook> p1 = guestBookQuery.ToPagedList(1, pageSize);

            return View(p1);
        }

 然后在表单验证的时候进行验证码和用户输入的字符进行比对即可

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1651583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公司数据防泄漏方案分享|防泄密软件有哪些

企业的数据安全是公司稳定发展的必要条件&#xff0c;如何防止内部数据泄露企业的数据安全是公司稳定发展的必要条件&#xff0c;如何防止内部数据泄露已经成为了一个亟待解决的问题。在这个信息时代&#xff0c;数据已经成为企业最重要的资产之一&#xff0c;因此&#xff0c;…

125.两两交换链表中的节点(力扣)

题目描述 代码解决及思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), …

flutter安卓项目生成MD5、sha1、公钥等

一&#xff1a;MD5、SHA1等生成方式 工具&#xff1a;Android Studio 1. 打开flutter项目下的Android目录 2. 创建signingReport运行配置项 3. build apk&#xff1a; 导航栏->build->Generate Signed App Bundle / APK... 4. 填写存放路径&#xff0c;同时创建文件xx…

了解集合与数据结构(java)

什么是数据结构? 数据结构就是 数据结构, 功能就是描述和组织数据 比如我有10万个QQ号, 我来组织, 有很多种组织方法, 比如链表, 树, 堆, 栈等等. 假如QQ号要查找数据, 有种数据结构查找数据速度很快, 我们就用它 加入QQ号要进行删除数据, 有种数据结构删除速度很快, 我们…

编程入门(六)【Linux系统基础操作三】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;LInux的进程管理和磁盘管理top命令显示查看进…

【CTS :testExtensionAvailability】

【CTS】android.hardware.camera2.cts.CameraExtensionCharacteristicsTest#testExtensionAvailability 报错&#xff1a; java.lang.AssertionError: Extensions system property : true does not match with the advertised extensions: false expected: but was: 通过对这…

idea Maven 插件 项目多环境打包配置

背景 不同环境的配置文件不一样&#xff0c;打包方式也有差异 1. 准备配置文件 这里 local 为本地开发环境 可改为 dev 名称自定义 test 为测试环境 prod 为生产环境 根据项目业务自行定义 application.yml 配置&#xff1a; spring:profiles:#对应pom中的配置active: spring.…

VMware虚拟机中ubuntu使用记录(5)—— 如何在ubuntu中安装USB相机ros驱动并获取usb摄像头数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、ROS下USB相机驱动1.准备工作(1) 下载驱动(2) 创建ROS工作空间 2. 安装usb_cam驱动(1) 安装usb_cam驱动包(2) 编译代码 3. 修改usb_cam驱动的配置文件(1) 查看US…

电商大数据的采集||电商大数据关键技术【基于Python】

.电商大数据采集API 什么是大数据&#xff1f; 1.大数据的概念 大数据即字面意思&#xff0c;大量数据。那么这个数据量大到多少才算大数据喃&#xff1f;通常&#xff0c;当数据量达到TB乃至PB级别时&#xff0c;传统的关系型数据库在处理能力、存储效率或查询性能上可能会遇…

深度剖析Comate智能产品:科技巧思,实用至上

文章目录 Comate智能编码助手介绍Comate应用场景Comate语言与IDE支持 Comate安装步骤Comate智能编码使用体验代码推荐智能推荐生成单测注释解释注释生成智能问答 Comate实战演练总结 Comate智能编码助手介绍 市面上现在有很多智能代码助手&#xff0c;当时互联网头部大厂百度也…

泰克MSO64示波器的应用

泰克MSO64示波器是一款功能强大、多用途的数字示波器&#xff0c;具备高性能和灵活的测量功能&#xff0c;适用于各种应用场景。它不仅具备传统示波器的功能&#xff0c;还集成了逻辑分析仪的功能&#xff0c;能够同时观测和分析模拟和数字信号。下面将介绍泰克MSO64示波器在几…

一文读懂 SOLID 原则

大家好&#xff0c;我是孔令飞&#xff0c;字节跳动云原生开发专家、前腾讯云原生技术专家、云原生实战营 知识星球星主、《企业级 Go 项目开发实战》作者。欢迎关注我的公众号【令飞编程】&#xff0c;Go、云原生、AI 领域技术干货不错过。 在 Go 项目开发中&#xff0c;你经常…

【快捷部署】024_Hive(3.1.3)

&#x1f4e3;【快捷部署系列】024期信息 编号选型版本操作系统部署形式部署模式复检时间024Hive3.1.3Ubuntu 20.04tar包单机2024-05-07 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff1a;cx…

【C++题解】1383. 奶牛和草丛

问题&#xff1a;1383. 奶牛和草丛 类型&#xff1a;深度搜索 题目描述&#xff1a; 奶牛Bessie计划好好享受柔软的春季新草。新草分布在 R 行 C 列的牧场里。它想计算一下牧场中的草丛数量。 在牧场地图中&#xff0c;每个草丛要么是单个“#”&#xff0c;要么是有公共边的相…

powershell 注册全局热键——提升效率小工具

powershell 注册全局热键 01 前言 在处理一些重复工作问题的时候&#xff0c;想搞一个小工具&#xff0c;配合全局快捷键来提高效率。因为是Windows系统&#xff0c;想到C#&#xff0c;但是又不想用VS开发&#xff0c;因为那样不够灵活&#xff0c;没办法随时修改随时用&…

构建 WebRTC 一对一信令服务器

构建 WebRTC 一对一信令服务器 构建 WebRTC 一对一信令服务器前言为什么选择 Nodejs&#xff1f;Nodejs 的基本原理浏览器使用 Nodejs安装 Nodejs 和 NPMsocket.io信令服务器搭建信令服务器客户端服务端启动服务器并测试 总结参考 构建 WebRTC 一对一信令服务器 前言 我们在学…

一文读懂三维点云分割

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 什么是点云分割&#xff1f; 点云是世界的一种非结构化三维数据表示&#xff0c;通常由激光雷达传感器、立体相机或深度传感器采集。它由一系列单个点组成&#xff0c;每个点由 x、y 和 z 坐标定义。 自动驾驶模型的点云…

达梦数据库导入数据问题

进行数据导入的时候遇到了导入数据问题 第一个问题&#xff1a; 该工具不能解析此文件&#xff0c;请使用更高版本的工具 这个是因为版本有点低&#xff0c;需要下载最新的达梦数据库 第二个问题&#xff1a; &#xff08;1&#xff09;本地编码&#xff1a;PG_GBK, 导入文…

【JavaEE 初阶(三)】多线程代码案例

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.单例模式2.1饿汉方式2.2饿汉方式 3.阻塞队列3.1概念3.2实现 4.定时器4.1概念4.…

js原生写一个小小轮播案例

先上示例&#xff1a; 附上代码 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content…