当前位置:首页 > JavaScript

js 实现验证码

2026-02-28 22:27:03JavaScript

实现验证码的基本思路

验证码通常用于防止自动化脚本提交表单或进行恶意操作。在JavaScript中,可以通过生成随机字符或数字,并将其显示在页面上,同时与用户输入进行比对来实现验证码功能。

生成随机验证码

使用JavaScript生成包含数字和字母的随机字符串作为验证码。可以通过Math.random()方法结合字符集来生成随机字符。

function generateCaptcha() {
    const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    let captcha = '';
    for (let i = 0; i < 6; i++) {
        const randomIndex = Math.floor(Math.random() * chars.length);
        captcha += chars[randomIndex];
    }
    return captcha;
}

显示验证码

将生成的验证码显示在HTML页面上,通常使用Canvas或普通的文本元素来呈现验证码。

<div id="captchaDisplay"></div>
function displayCaptcha() {
    const captcha = generateCaptcha();
    document.getElementById('captchaDisplay').textContent = captcha;
    return captcha; // 返回验证码用于后续验证
}

验证用户输入

用户提交表单时,需要比对用户输入的验证码与生成的验证码是否一致。

<input type="text" id="userCaptcha" placeholder="输入验证码">
<button onclick="validateCaptcha()">验证</button>
let currentCaptcha = displayCaptcha(); // 初始化验证码

function validateCaptcha() {
    const userInput = document.getElementById('userCaptcha').value;
    if (userInput === currentCaptcha) {
        alert('验证码正确');
    } else {
        alert('验证码错误,请重新输入');
        currentCaptcha = displayCaptcha(); // 刷新验证码
    }
}

增加验证码的复杂度

为了提高安全性,可以使用Canvas绘制带有干扰线或扭曲效果的验证码。

function drawCaptcha(captcha) {
    const canvas = document.getElementById('captchaCanvas');
    const ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    // 绘制背景色
    ctx.fillStyle = '#f0f0f0';
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    // 绘制验证码文本
    ctx.font = '30px Arial';
    ctx.fillStyle = '#000';
    ctx.fillText(captcha, 10, 30);

    // 绘制干扰线
    ctx.strokeStyle = '#888';
    for (let i = 0; i < 5; i++) {
        ctx.beginPath();
        ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height);
        ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height);
        ctx.stroke();
    }
}

完整示例

以下是一个完整的HTML和JavaScript实现示例:

js 实现验证码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>验证码示例</title>
    <style>
        #captchaCanvas {
            border: 1px solid #000;
            margin: 10px 0;
        }
    </style>
</head>
<body>
    <canvas id="captchaCanvas" width="200" height="50"></canvas>
    <input type="text" id="userCaptcha" placeholder="输入验证码">
    <button onclick="validateCaptcha()">验证</button>
    <button onclick="refreshCaptcha()">刷新验证码</button>

    <script>
        let currentCaptcha;

        function generateCaptcha() {
            const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
            let captcha = '';
            for (let i = 0; i < 6; i++) {
                const randomIndex = Math.floor(Math.random() * chars.length);
                captcha += chars[randomIndex];
            }
            return captcha;
        }

        function drawCaptcha(captcha) {
            const canvas = document.getElementById('captchaCanvas');
            const ctx = canvas.getContext('2d');
            ctx.clearRect(0, 0, canvas.width, canvas.height);

            ctx.fillStyle = '#f0f0f0';
            ctx.fillRect(0, 0, canvas.width, canvas.height);

            ctx.font = '30px Arial';
            ctx.fillStyle = '#000';
            ctx.fillText(captcha, 10, 30);

            ctx.strokeStyle = '#888';
            for (let i = 0; i < 5; i++) {
                ctx.beginPath();
                ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height);
                ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height);
                ctx.stroke();
            }
        }

        function refreshCaptcha() {
            currentCaptcha = generateCaptcha();
            drawCaptcha(currentCaptcha);
        }

        function validateCaptcha() {
            const userInput = document.getElementById('userCaptcha').value;
            if (userInput === currentCaptcha) {
                alert('验证码正确');
            } else {
                alert('验证码错误,请重新输入');
                refreshCaptcha();
            }
        }

        // 初始化
        refreshCaptcha();
    </script>
</body>
</html>

注意事项

  • 前端验证码仅能提供基本防护,无法完全阻止恶意攻击。对于高安全性需求,建议结合后端验证。
  • 避免使用过于简单的验证码(如纯数字),容易被破解。
  • 可以结合服务器端生成验证码并存储,以提高安全性。

标签: 验证码js
分享给朋友:

相关文章

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…