生成验证码

构建简单的node服务器

  • 新建serve文件夹
  • 进入 serve文件夹初始化npm项目 npm init
  • 新建server.js文件
const express = require('express');
const http = require('http');
const app = express();
const server = http.createServer(app);
const svgCaptcha = require('svg-captcha');  //验证码插件//设置允许跨域访问
app.all("*", function(req, res, next) {//设置允许跨域的域名,*代表允许任意域名跨域res.header("Access-Control-Allow-Origin", "*");//允许的header类型res.header("Access-Control-Allow-Headers", "content-type");//跨域允许的请求方式 res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");if (req.method.toLowerCase() == 'options')res.send(200);  //让options尝试请求快速结束elsenext();
})
// 获取验证码接口
app.get('/getCodeImg', (req, res) => {// 字母验数字证码// let codeConfig = {//     size: 4,// 验证码长度//     ignoreChars: '0o1i', // 验证码字符中排除 0o1i//     noise: 5, // 干扰线条的数量//     width: 100, //验证码宽度//     height: 40, //验证码高度//     fontSize: 40,   //字体大小//     color: true,    //开启字体颜色//     background: '#cc9966',//背景颜色//     // charPreset:'abcd123456789', //随机预设字符// }// let captcha = svgCaptcha.create(codeConfig); //验证码// 数学表算式验证码let codeConfig = {mathMin: 1, //数学表达式的最小值mathMax: 20, // 数学表达式的最大值mathOperator: '+', // 使用的运算符:+、-或+-(用于随机的+或-)noise: 5, // 干扰线条的数量width: 100, //验证码宽度height: 40, //验证码高度fontSize: 40,   //字体大小color: true,    //开启字体颜色background: '#cc9966',//背景颜色}let captcha = svgCaptcha.createMathExpr(codeConfig); //算式验证码//captcha.text 验证码的文字码//captcha.data 验证码图片的svg数据res.json({status: 200,data: captcha.data})
});server.listen(3000, () => {console.log("server is up and running on  http://127.0.0.1:3000");
});
  • 安装express包
    npm i express -s
  • 安装svg-captcha包
    npm i svg-captcha -s
  • 启动服务器
    node server.js

在serve文件同级目录新建客户端网页 client.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>验证码</title>
</head>
<style>.main {width: 1000px;margin: 0 auto;padding-top: 100px;}.code {height: 40px;line-height: 40px;padding: 0 4px;box-sizing: border-box;outline: 0;font-size: 16px;}.code-img {vertical-align: middle;margin-left: 20px;}.btn {cursor: pointer;color: #fff;background-color: #409eff;border: 1px solid #409eff;text-align: center;box-sizing: border-box;outline: 0;margin: 0;font-weight: 500;padding: 12px 20px;font-size: 14px;border-radius: 4px;}
</style><body><div class="main"><div><input type="text" class="code" id="code"><sapn class="code-img" id="codeImg" onclick="getCodeImg()"></sapn></div><button class="btn" >验证</button></div>
</body>
</html>
<script>window.onload = function() {getCodeImg();}async function getCodeImg() {// 请求接口获取验证码数据// fetch 默认是get请求let response = await fetch('http://127.0.0.1:3000/getCodeImg');response.json().then(res => {document.querySelector('#codeImg').innerHTML = res.data; //渲染验证码图片})}
</script>

这时候运行网页就可以看到验证码

验证

在验证之前我们要先将验证码的答案保存起来,为了确保验证码答案不会被另一个浏览器的验证码覆盖,使用fingerprint2插件获取浏览器的指纹ID

修改客户端网页代码

  • 引用 fingerprint2
<script src="https://lib.baomitu.com/fingerprintjs2/2.1.5/fingerprint2.js"></script>
  • 获取浏览器的指纹ID
 // 获取浏览器指纹function getFingerprint() {// 因为是异步的所以使用 Promisereturn new Promise((resolve, reject) => {// 浏览器指纹Fingerprint2.get((components) => {const values = components.map(component => component.value);const murmur = Fingerprint2.x64hash128(values.join(''), 31); // 生成浏览器指纹resolve(murmur)});})}
  • 将指纹ID作为获取获取验证码接口的参数
  let browserId = ''; //定义浏览器id全局变量window.onload = function() {getFingerprint().then(res => {browserId = res;getCodeImg();})}async function getCodeImg() {// 请求接口获取验证码数据// fetch 默认是get请求let response = await fetch('http://127.0.0.1:3000/getCodeImg?browserId=' + browserId);response.json().then(res => {document.querySelector('#codeImg').innerHTML = res.data;  //渲染验证码图片})}

服务端代码修改

  • 因为没有使用数据库,所以我们将数据保存在本地json文件
  • 在server.js同级目录创建json文件 db.json
const fs = require('fs'); //引入 fs 核心模块
const dbJson = './db.json'; //文件路径
  • 在getCodeImg接口添加代码
 let browserId = req.query.browserId; // 获取浏览器指纹id参数fs.readFile(dbJson, function(err, data) {if (err) {return console.error(err);}//将二进制的数据转换为字符串let str = data.toString();let verificationCode = [];//将字符串转换为json对象if (str) {verificationCode = JSON.parse(str);}let index = verificationCode.findIndex(item => item.browserId === browserId)console.log(str, 'str')console.log(index, 'index')if (index > -1) {verificationCode[index].answer = captcha.text} else {let obj = {browserId: browserId,answer: captcha.text}verificationCode.push(obj);//将传来的对象push进数组对象中}let dataStr = JSON.stringify(verificationCode);//把json对象转换成字符串重新写入json文件中fs.writeFile(dbJson, dataStr, function(err) {if (err) {console.error(err);}})})
  • 编写验证接口
app.post('/validationCode', (req, res) => {var data = '';req.on('data', function(chunk) {data += chunk;});req.on('end', function() {data = decodeURI(data);var dataObject = JSON.parse(data);fs.readFile(dbJson, function(err, data) {if (err) {return console.error(err);}let verificationCode = JSON.parse(data.toString()) || [];let captcha = verificationCode.filter(item => item.browserId === dataObject.browserId)[0]if (dataObject.code === captcha.answer) {res.json({status: 200,msg: '验证码正确',})} else {res.json({status: 201,msg: '验证码错误'})}})});
});

修改ndoe代码要重启服务才会生效

客户端验证按钮

  // 验证document.querySelector('#verificationBtn').addEventListener('click', async function() {let code = document.querySelector('#code').valuelet param = {browserId: browserId,code: code}let response = await fetch('http://127.0.0.1:3000/validationCode', {method: "POST",body: JSON.stringify(param)})response.json().then(res => {alert(res.msg)})})

最终效果如下

源码地址

https://gitee.com/swfcode/code-img.git

svg-captcha生成验证码以及验证相关推荐

  1. captcha 生成验证码

    你好,我是悦创. 公众号:AI悦创 博客原文:https://www.aiyc.top/archives/476.html 对于验证码破解,很多机构都停留于云打码.OCR 等基础破解方法,当然不能否认 ...

  2. Spring Boot 配置Kaptcha(谷歌验证码工具)(生成验证码、验证验证码)

    1 Kaptcha 1.1 Kaptcha简介 Kaptcha 是一个扩展自simplecaptcha的验证码库,默认情况下,Kaptcha非常易于设置和使用,并且默认输出会产生一个很难验证的验证码. ...

  3. JSP+servlet生成验证码并验证

    生成验证码的基本过程是: <%@ page language="java" import="java.util.*" pageEncoding=" ...

  4. jsp页面生成验证码且验证

    一般先写出验证码,利用java语言写出(后台或者前台写,前台jsp还是用<% %>包java语句写出) 然后登陆页面用img的src引入验证码的方法,比如: <img src=&qu ...

  5. html前端登录验证码,前端登录页面开发_js生成验证码并验证

    /p> 前端集成开发工具: margin: 0; padding: 0; } a { text-decoration: none; } .main_bar { width: 100%; heig ...

  6. js生成验证码并验证 .

    <html> <head> <title>验证码</title> <style type="text/css"> .co ...

  7. js生成验证码并且验证

    <html> <head> <title>验证码</title> <style type="text/css"> #co ...

  8. 一文搞懂Go整合captcha实现验证码功能

    最近在使用Go语言搞一个用户登录&注册的功能,说到登录&注册相关,我们油然会产生一种增加验证码的想法,因此着手实现,后来在GitHub上找到了这个名叫captcha的插件,于是就利用文 ...

  9. 使用Happy Capthca生成验证码

    Happy Captcha是一款易于使用的Java验证码软件包,旨在花最短的时间,最少的代码量实现验证码功能 Maven依赖 <dependency><groupId>com. ...

最新文章

  1. 皮一皮:这车是要开上天啊...
  2. db2 日期加减一天_常用SQL系列之(八):列值累计、占比、平均值以及日期运算等...
  3. QT旋转按钮控件的实现
  4. 调剂2002年计算机科学与技术,教育部关于做好2002年全国研究生录取工作的通知...
  5. 批量创建同义词并授权
  6. Java内存模型深度解析:顺序一致性
  7. java 看书浏览器官_JAVA读取文件流,设置浏览器下载或直接预览操作
  8. c++ 写入文件_Python学习第52课-写入文件
  9. linux ruby作用域,浅谈ruby语言中的一些概念(lambda, proc, block)
  10. 利用Applet类和Runnable接口实现滚动字幕
  11. Grep与web漏洞挖掘转
  12. 17秋 SDN课程 第一次作业
  13. 一些鼠标指针图案大全和美化 20+
  14. 昂达v819i安卓bios
  15. 腾讯敏感词汇大全_腾讯数平精准推荐 | OCR技术之识别篇
  16. 《Unity Shader入门精要》冯乐乐著 书中彩图
  17. win10桌面穿越,多桌面切换
  18. PgMP项目集管理专家认证培---艾威PgMP培训机构
  19. restore,recover的区别
  20. 如何在安卓上android studio上构建本地服务器

热门文章

  1. (转)Cognos Transformer IQD文件结构及规则
  2. 大数据集群失联问题解决方案
  3. 编程之美2013年大赛解题思路--初赛(A)
  4. vue-iview table时间表格显示(行合并、背景颜色显示)
  5. Android App节日换肤
  6. 汽车动力总成-基于GCAir和GCKontrol的TCU硬件在环HiL测试
  7. Python网络爬虫实战(一)快速入门
  8. Java学习的第一道垲
  9. Kafka命令行常用命令说明
  10. 背完这999句,英语口语绝不…