验证码在各大网站中随处可见,它实际的作用就是为了防止机器提交,从而提高安全性。验证码的类型可以分为三类:普通验证码,行为验证码以及短信验证码。普通验证码是比较早出现的,比如一张模糊的图片,里面由数字或者字母组成,通过用户输入的值进行比对。而随着技术的发展,现在更多的则是行为验证码和短信验证码,行为验证码比如拖动一个滑动以拼成一个完整的图片,或者是把一个角度错误的图片旋转成正确的角度等。而短信验证码,则是给本人手机号码以短信的方式发送验证码。在这几种类型的验证码中,行为验证码实现起来的话,相对繁琐,虽然也有许多的第三方库,但也大多是需要付费的,短信验证码也是一样需要付费。所以今天咱们就讲讲普通验证码的实现与应用,虽说普通验证码没有另外两个验证码那么安全,但是对安全性的保障还是能起作用的。
一、验证码的具体流程
首先在实现它之前,我们先来了解验证码的具体操作流程是怎么样的。在这里,可以分为两个步骤:
1.获取验证码图片
服务端生成随机的验证码图片并保存图片中的文字内容
客户端通过img元素的src地址获取验证码图片
2.进行验证
服务端判断是否对验证码进行验证
是则验证客户端传递过来的验证码是否和服务端保存的验证码一致
通过上述,我们知道了验证码的具体操作流程,那么接下来就进行验证码的实现。
这里我们使用 svg-captcha 这个库来实现。
npm install --save svg-captcha
const svgCaptcha = require("svg-captcha")
- /全局变量 保存验证码
- let myCode;
-
- app.get("/code", (req, res) => {
- const captcha = svgCaptcha.create({
- size: 5, //验证码字符个数
- ignoreChars: "0oi1l",//忽略字符
- noise: 3,//干扰线
- color: true,//字符是否有颜色
- // width: 100,//宽
- // height: 35,//高
- });
-
-
- // console.log(captcha.text);
- myCode = captcha.text;//保存在全局变量中
- console.log(myCode);
-
- res.type("svg");
- res.send(captcha.data)
- })
- app.post('/login', (req, res) => {
- //解析数据
- let { username, pwd, code } = req.body;
- console.log(username, pwd);
- console.log("验证码:", code);
-
- //校验验证码
- if (code.toLowerCase() != myCode.toLowerCase()) {
- res.send({ code: 500, msg: "验证码错误" })
- return;
- }
-
- //表单校验
- if (!username || !pwd) {
- res.send({ code: 500, msg: "用户名、密码均不能为空" })
- return;
- }
-
- //..
- res.send({ code: 200, msg: "登录成功", username })
- })
-
- <h2>登录h2>
-
- <label for="">用户名:label>
-
-

-
-
- const o = document.querySelector('input');
- const oCode = document.querySelector('#xxcode');
-
- document.querySelector('button').onclick = function () {
- //测试
- let user = 'admin',
- pwd = "123";
-
- login(user, pwd)
- }
-
- document.querySelector('img').onclick=function(){
- //切换验证码
- // let t=Date.now()
- this.src="http://localhost:3000/code?"+Math.random();
- console.log('1111111111111');
- }
-
- async function login(username, pwd) {
- let rst = await fetch("http://localhost:3000/login", {
- method: "post",
- headers: {
- // "content-type":"application/x-www-form-urlencoded"
- "content-type": "application/json"
- },
- // body: `username=${username}&pwd=${pwd}`
- body: JSON.stringify({ username, pwd, code: oCode.value })
- })
-
- let data = await rst.json();
- console.log(data);
- }