当前位置:首页 > uni-app

uniapp图形验证码

2026-02-05 17:39:42uni-app

uniapp图形验证码实现方法

在uniapp中实现图形验证码可以通过以下方式完成:

uniapp图形验证码

前端生成验证码

使用canvas绘制验证码图形,生成随机验证码字符串并显示:

uniapp图形验证码

<template>
  <view>
    <canvas canvas-id="verifyCanvas" @tap="refreshCode"></canvas>
  </view>
</template>

<script>
export default {
  data() {
    return {
      verifyCode: ''
    }
  },
  mounted() {
    this.refreshCode()
  },
  methods: {
    refreshCode() {
      const ctx = uni.createCanvasContext('verifyCanvas', this)
      const code = this.generateRandomCode(4)
      this.verifyCode = code

      // 绘制背景
      ctx.setFillStyle('#f5f5f5')
      ctx.fillRect(0, 0, 120, 40)

      // 绘制干扰线
      for(let i = 0; i < 5; i++) {
        ctx.setStrokeStyle(this.randomColor())
        ctx.beginPath()
        ctx.moveTo(Math.random() * 120, Math.random() * 40)
        ctx.lineTo(Math.random() * 120, Math.random() * 40)
        ctx.stroke()
      }

      // 绘制验证码
      for(let i = 0; i < code.length; i++) {
        ctx.setFontSize(20)
        ctx.setFillStyle(this.randomColor())
        ctx.setTextBaseline('top')
        ctx.fillText(
          code[i],
          20 + i * 20 + Math.random() * 5,
          10 + Math.random() * 10
        )
      }

      ctx.draw()
    },
    generateRandomCode(length) {
      const chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
      let result = ''
      for(let i = 0; i < length; i++) {
        result += chars.charAt(Math.floor(Math.random() * chars.length))
      }
      return result
    },
    randomColor() {
      const r = Math.floor(Math.random() * 256)
      const g = Math.floor(Math.random() * 256)
      const b = Math.floor(Math.random() * 256)
      return `rgb(${r},${g},${b})`
    }
  }
}
</script>

服务端验证方案

  1. 创建API接口生成验证码并返回给前端
  2. 将验证码文本存储在session或redis中
  3. 用户提交时验证输入是否匹配

Node.js示例:

const express = require('express')
const svgCaptcha = require('svg-captcha')
const session = require('express-session')

const app = express()
app.use(session({ secret: 'your-secret-key' }))

// 获取验证码
app.get('/api/captcha', (req, res) => {
  const captcha = svgCaptcha.create()
  req.session.captcha = captcha.text
  res.type('svg')
  res.status(200).send(captcha.data)
})

// 验证验证码
app.post('/api/verify', (req, res) => {
  if(req.body.code === req.session.captcha) {
    res.json({ success: true })
  } else {
    res.json({ success: false })
  }
})

第三方验证码服务

  1. 使用极验、腾讯验证码等第三方服务
  2. 集成SDK到uniapp项目中
  3. 配置服务端验证逻辑

极验示例集成:

// 在index.html中引入极验SDK
<script src="https://static.geetest.com/static/tools/gt.js"></script>

// uniapp页面中使用
initGeetest() {
  initGeetest({
    gt: this.gt,
    challenge: this.challenge,
    offline: !this.success,
    new_captcha: true
  }, (captchaObj) => {
    captchaObj.appendTo("#captcha")
    captchaObj.onSuccess(() => {
      const result = captchaObj.getValidate()
      // 提交result到服务端验证
    })
  })
}

安全注意事项

  1. 验证码应设置有效期,通常2-5分钟
  2. 限制验证码尝试次数,防止暴力破解
  3. 验证通过后立即销毁session中的验证码
  4. 避免使用简单数字组合,增加复杂度
  5. 考虑添加滑动验证等交互方式增强安全性

性能优化建议

  1. 使用缓存减少重复生成开销
  2. 前端生成减轻服务器压力
  3. 合理设置验证码过期时间
  4. 考虑使用Web Worker处理复杂图形生成

以上方法可根据实际项目需求选择组合使用,纯前端方案适合简单场景,重要业务建议采用服务端验证或第三方专业验证服务。

标签: 验证码图形
分享给朋友:

相关文章

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $imag…

php实现验证码的识别

php实现验证码的识别

验证码识别的基本方法 验证码识别通常分为手动实现和第三方工具两种方式。手动实现需要图像处理和机器学习知识,而第三方工具则更快捷。 使用Tesseract OCR识别验证码 Tesseract是一个开…

js 实现验证码

js 实现验证码

实现验证码的 JavaScript 方法 生成随机验证码 验证码通常由随机字符(数字、字母或混合)组成。以下代码生成一个 6 位随机验证码(数字和字母混合): function generateC…

react验证码实现

react验证码实现

验证码生成与验证 在React中实现验证码功能通常涉及生成随机验证码字符串、渲染为图像或文本,并与用户输入进行比对。以下是具体实现方法: 生成随机验证码 使用JavaScript生成随机字符串作为验…

css图形制作

css图形制作

CSS 图形制作基础 CSS 可以通过 border、transform、clip-path 等属性创建基本图形,无需依赖图片或 SVG。 矩形与正方形 通过 width 和 height 控制尺寸…