canvas动态生成验证码的核心是用javascript分层绘制字符、干扰线、干扰点和背景色,强调随机性与视觉分离;字符集排除易混淆字符,长度4–6位,每次点击重绘并存储code供表单验证。

用 Canvas 动态生成带干扰码的图形验证码,核心是把字符、干扰线、干扰点、背景色全部用 JavaScript 控制绘图上下文(2d)逐层绘制出来。关键不在于堆功能,而在于每一步的随机性与视觉分离——让机器难识别,人眼能分辨。
基础结构:Canvas 容器与交互绑定
HTML 中只需一个 <canvas></canvas> 标签,设好宽高(如 120×40),并绑定点击事件触发重绘:
- 设置
id="verifyCanvas"方便 JS 获取 - 添加
onclick="drawCode()"实现点击刷新 - 提供备用提示文本,兼容低版本浏览器:
您的浏览器不支持 canvas
验证码内容:随机字符 + 可控组合
字符集建议包含大小写字母(排除易混淆的 I、O、l、0)和数字,长度通常为 4–6 位。生成逻辑要独立封装:
- 定义字符数组,例如
['A','B','C',...,'a','b','c',..., '2','3','5','6'] - 用
Math.random()随机取索引,拼接成字符串,存为全局或实例变量(如code = '') - 确保每次调用
drawCode()都重新生成,避免缓存旧值
绘制流程:分层渲染提升可维护性
在 drawCode() 函数中按顺序执行以下步骤,每步对应 canvas 上下文的一次操作:
-
清空画布:用
ctx.clearRect(0, 0, width, height)避免残留 -
绘制背景:用
ctx.fillStyle设随机浅色(如rgb(240,245,250)),再fillRect() -
绘制字符:对每个字符单独设置:
- 随机字号(24–36px)、随机颜色(避开背景色相近值)
- 水平间距错开,纵向位置微调(±5px)
- 用
ctx.save()+ctx.rotate()+ctx.fillText()+ctx.restore()实现单字倾斜
-
添加干扰线:用
moveTo()和lineTo()画 3–5 条细线,颜色稍淡(如rgba(180,180,180,0.6)),两端超出字符区 -
撒干扰点:循环 30–60 次,用
fillRect(x, y, 1, 1)或arc()绘制随机位置的小点,颜色与干扰线协调
验证对接:把生成结果暴露给表单逻辑
用户输入后需比对,所以生成的验证码值必须可被 JS 访问:
- 将
code存在闭包变量、模块导出对象,或挂到 canvas 元素上(如canvas.dataset.code = code) - 提交时读取输入框值,转为统一格式(如全小写、去空格),再与存储的
code对比 - 注意:前端校验仅作体验优化,真实验证必须经后端确认,防止绕过
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











