当前位置: 首页 > news >正文

前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)

图形验证码是网站安全防护的重要组成部分,能有效防止自动化脚本进行恶意操作,如何实现一个简单的运算图形验证码?本文封装了一个简单的js类,可以用于生成简单但安全的图形验证码。它支持自定义验证码样式,包括字体大小、颜色以及干扰线的数量和样式。如下图。

核心js文件如下:

// mcaptcha.jsexport class Mcaptcha {constructor(options) {this.options = options;this.fontSize = 24;this.init();this.refresh();}init() {this.ctx = wx.createCanvasContext(this.options.el);this.ctx.setTextBaseline("middle");this.ctx.setFillStyle(this.randomColor(180, 240));}refresh() {var code = '';var num1 = this.randomNum(0, 9)var num2 = this.randomNum(0, 9)this.options.createCodeImg = code;code = num1 + '+' + num2 + '=?'this.options.num1 = num1;this.options.num2 = num2;let arr = [code]if (arr.length === 0) {arr = ['e', 'r', 'r', 'o', 'r'];};let offsetLeft = this.options.width * 0.6 / (arr.length - 1);let marginLeft = this.options.width * 0.2;arr.forEach((item, index) => {this.ctx.setFillStyle(this.randomColor(0, 180));let size = this.randomNum(24, this.fontSize);this.ctx.setFontSize(size);let dis = offsetLeft * index + marginLeft - size * 0.3;let deg = this.randomNum(-1, 1);this.ctx.translate(dis, this.options.height * 0.45);this.ctx.rotate(deg * Math.PI / 180);this.ctx.fillText(item, 2, this.randomNum(0,10));this.ctx.rotate(-deg * Math.PI / 180);this.ctx.translate(-20, -this.options.height * 0.6);})for (var i = 0; i < 4; i++) {this.ctx.strokeStyle = this.randomColor(40, 180);this.ctx.beginPath();this.ctx.moveTo(this.randomNum(0, this.options.width), this.randomNum(0, this.options.height));this.ctx.lineTo(this.randomNum(0, this.options.width), this.randomNum(0, this.options.height));this.ctx.stroke();}for (var i = 0; i < this.options.width / 4; i++) {this.ctx.fillStyle = this.randomColor(0, 255);this.ctx.beginPath();this.ctx.arc(this.randomNum(0, this.options.width), this.randomNum(0, this.options.height), 1, 0, 2 * Math.PI);this.ctx.fill();}this.ctx.draw();}validate(code) {var code = Number(code)var v_code = this.options.num1 + this.options.num2if (code == v_code) {return true} else {this.refresh()return false}}randomNum(min, max) {return Math.floor(Math.random() * (max - min) + min);}randomColor(min, max) {let r = this.randomNum(min, max);let g = this.randomNum(min, max);let b = this.randomNum(min, max);return "rgb(" + r + "," + g + "," + b + ")";}
}

使用方法

以微信小程序为例,其他环境适当修改。

  1. 引入Mcaptcha.js
import Mcaptcha from './mcaptcha.js';

     2.初始化Mcaptcha实例

在你的页面的JS文件中,创建一个Mcaptcha实例,并传入相应的配置选项。

Page({onLoad: function() {new Mcaptcha({el: 'captchaCanvas', // canvas的IDwidth: 300, // canvas的宽度height: 150 // canvas的高度});}
});

      3.在WXML中添加Canvas元素

在页面的WXML文件中,添加一个Canvas元素,用于展示验证码。

<canvas canvas-id="captchaCanvas" style="width: 300px; height: 150px;"></canvas>

4.使用Mcaptcha实例生成验证码

调用Mcaptcha实例的refresh方法来生成验证码。

Page({// ...onShow: function() {// 假设mcaptcha是之前创建的Mcaptcha实例mcaptcha.refresh();}
});

5.验证用户输入

当用户输入验证码并提交时,调用Mcaptcha实例的validate方法进行验证

Page({// ...checkCaptcha: function(inputCode) {// 假设mcaptcha是之前创建的Mcaptcha实例if (mcaptcha.validate(inputCode)) {wx.showToast({title: '验证成功!',icon: 'success'});} else {wx.showToast({title: '验证失败,请重试。',icon: 'none'});}}
});

 Mcaptcha.js的核心方法

  • refresh(): 生成新的验证码,包括随机数字、运算符和干扰元素。
  • validate(code): 验证用户输入的验证码是否正确,返回布尔值。
  • randomNum(min, max): 生成指定范围内的随机数。
  • randomColor(min, max): 生成指定范围内的随机颜色。

相关文章:

前端实战:使用JS和Canvas实现运算图形验证码(uniapp、微信小程序同样可用)

图形验证码是网站安全防护的重要组成部分&#xff0c;能有效防止自动化脚本进行恶意操作&#xff0c;如何实现一个简单的运算图形验证码&#xff1f;本文封装了一个简单的js类&#xff0c;可以用于生成简单但安全的图形验证码。它支持自定义验证码样式&#xff0c;包括字体大小…...

SQL Server 语句日期格式查找方法

1. SQL Server中&#xff0c;处理日期格式和查找特定日期格式方法示例 在SQL Server中&#xff0c;处理日期格式和查找特定日期格式的记录是一个常见的需求。SQL Server提供了多种函数和格式选项来处理和比较日期。以下是一个详细的示例&#xff0c;展示了如何根据特定日期格式…...

【Python报错已解决】python setup.py bdist_wheel did not run successfully.

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

查询结果是1条记录,但执行更新却是2条记录原因查找

1、问题 在 sqlserver2008 数据库 select * from userinfo WHERE username SP4267ED2409011; 查询结果是1条记录&#xff0c;但执行更新 UPDATE userinfo SET qt qt 2.0 WHERE username SP4267ED2409011; 结果是这样的 Affected rows: 1 Affected rows: 1 返回了2个&#x…...

校园网站的管理与建设心得体会

随着时代发展的需要&#xff0c;学校网站建设如雨后春笋般的涌现出来。在这股大潮的带动下我校校园网网站建设也逐步开展深入。通过数年的发展&#xff0c;我校的校园网建设取得了长足发展&#xff0c;架构了数字化交流平台&#xff0c;整理了专题学习网站资源&#xff0c;开设…...

智慧农业——InsectMamba利用状态空间模型对害虫进行分类

介绍 论文地址&#xff1a;https://arxiv.org/abs/2404.03611 害虫分类是农业中的一个重要问题。准确识别有害害虫可减少对作物的损害&#xff0c;确保粮食安全和环境的可持续发展。然而&#xff0c;害虫及其自然环境的高度拟态性和物种多样性使得视觉特征的提取极具挑战性。…...

基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask

研究背景 癌症作为全球范围内最主要的死亡原因之一&#xff0c;已成为当代医学研究和公共健康的重大挑战。据世界卫生组织&#xff08;WHO&#xff09;的统计&#xff0c;癌症每年导致全球数百万人的死亡。随着人口老龄化、环境污染和生活方式的改变&#xff0c;癌症的发病率逐…...

docker|Oracle数据库|docker快速部署Oracle11g和数据库的持久化(可用于生产环境)

一、 容器数据持久化的概念 docker做为容器化的领先技术&#xff0c;现在广泛应用于各个平台中&#xff0c;但不知道什么时候有一个说法是docker并不适用容器化数据库&#xff0c;说容器化的数据库性能不稳定&#xff0c;其实&#xff0c;这个说法主要是因为对docker的数据持…...

uni-app 聊天界面滚动到消息底部

目录 问题 组件 页面 使用的API 总结 问题 当你发一个消息&#xff0c;但是消息却需要你自己向下滑你才能看见&#xff0c;否则一直呗输入框挡住。 组件 scroll-view组件&#xff1a;一般使用scroll-view组件的都采取使用其scroll-into-view或者scroll-to属性。 scroll-…...

学习风格的类型

学习风格是指个体在学习过程中偏好的方式和方法。不同的学习风格反映了人们在接收、处理和记忆信息方面的不同偏好。了解自己的学习风格可以帮助提高学习效率和效果。以下是几种常见的学习风格类型&#xff1a; 1. 视觉型&#xff08;Visual Learner&#xff09; 特点&#x…...

GCP容器镜像仓库使用

GCP容器镜像仓库产品为&#xff1a;Artifact Registry。 1&#xff09;用户账号认证 GCP需要前置在控制台登陆对应环境账号。然后执行以下命令操作&#xff1a; $ gcloud auth login 2&#xff09;登陆镜像仓库 $ gcloud auth configure-docker us-west1-docker.pkg.dev …...

【C++ Primer Plus习题】16.10

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…...

Django框架全面指南

Django是一个高级的Python Web框架,它鼓励快速开发和清晰、实用的设计。本指南将全面介绍Django的核心概念和使用方法。 1. Django简介 Django遵循"batteries included"哲学,提供了Web开发所需的几乎所有功能。它的主要特点包括: ORM(对象关系映射)URL路由模板…...

git 更新LingDongGui问题解决

今天重新更新灵动gui的代码&#xff0c;以便使用最新的arm-2d&#xff0c;本来以为是比较简单的一件事情&#xff08;因为以前已经更新过一次&#xff09;&#xff0c;却搞了大半天&#xff0c;折腾不易啊&#xff0c;简单记录下来&#xff0c;有同样遇到问题的同学参考&#x…...

Thymeleaf模版引擎

Thymeleaf是面向Web和独立环境的现代服务器端Java模版引擎&#xff0c;能够处理HTML、XML、JavaScript、CSS甚至纯文本。Thymeleaf旨在提供一个优雅的、高度可维护的创建模版的方式。为了实现这一目标&#xff0c;Thymeleaf建立在自然模版的概念上&#xff0c;将其逻辑注入到模…...

jpa适配mysql切换达梦可能的坑

1、liquibase脚本 &#xff08;1&#xff09;达梦数据库不支持&#xff0c;修改字段varchar改成blob <changeSet author"ly" id"v3.0_4_202307111505_101"><renameColumn tableName"PC_SS_ZRQD" oldColumnName"BHNR" newCo…...

922. 按奇偶排序数组 II 双指针 力扣

922. 按奇偶排序数组 II 已解答 简单 相关标签 相关企业 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时…...

Vue接入高德地图并实现基本的路线规划功能

目录 一、申请密钥 二、安装依赖 三、代码实现 四、运行截图 五、官方文档 一、申请密钥 登录高德开放平台&#xff0c;点击我的应用&#xff0c;先添加新应用&#xff0c;然后再添加Key。 如图所示填写对应的信息&#xff0c;系统就会自动生成。 二、安装依赖 npm i am…...

linux网络编程4

24.9.20学习目录 一.UDP&#xff08;续&#xff09;1.广播广播流程 2.多播多播流程 一.UDP&#xff08;续&#xff09; 1.广播 由一台主机向该主机所在子网内的所有主机发送数据的方式&#xff1b; 广播只能用UDP或原始IP实现&#xff0c;不能使用TCP&#xff1b; 其作用是将…...

Spring模块详解Ⅳ(Spring ORM和Spring Transaction)

目录 Spring ORM&#xff08;Object-Relational Mapping&#xff09;作用核心组件使用步骤事务管理代码演示优点挑战总结 Spring Transaction&#xff08;Spring事务管理&#xff09;事务的基本概念Spring事务管理的类型声明式事务管理事务的传播行为&#xff08;Propagation&a…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...