千家信息网

Vue如何实现图片验证码生成

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍"Vue如何实现图片验证码生成",在日常操作中,相信很多人在Vue如何实现图片验证码生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Vue如何实现图片
千家信息网最后更新 2026年11月04日Vue如何实现图片验证码生成

这篇文章主要介绍"Vue如何实现图片验证码生成",在日常操作中,相信很多人在Vue如何实现图片验证码生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Vue如何实现图片验证码生成"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、前端图片验证码生成

前端逻辑大体就是进行图形绘制,取几个随机数放入图片中,加入干扰,进行验证

1.创建验证码组件identify.vue

2.父组件

前端生成验证码的校验是自己生成验证码,用户输入的值和生成的验证码字符串进行比对校验的,校验没有走后端,在真正发送请求到后端的时候也是不将验证码传给后台的。

 

二、后端生成图片验证码

后台思路很,利用BufferedImage类创建一张图片,再用Graphics对图片进行绘制(生成随机字符,添加噪点,干扰线)即可。

package com.hengtiansoft.gxrc.base.util; import com.hengtiansoft.gxrc.common.constant.MagicNumConstant;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component; import javax.imageio.ImageIO;import java.awt.Font;import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.util.Base64;import java.util.HashMap;import java.util.Map;import java.util.Random; @Slf4j@Componentpublic class ImgCaptchaUtil {      private Random random = new Random();    /**     * 验证码的宽     */    private final int width = 160;    /**     * 验证码的高     */    private final int height = 40;    /**     * 验证码的干扰线数量     */    private final int lineSize = 30;    /**     * 验证码词典     */    private final String randomString = "0123456789abcdefghijklmnopqrstuvwxyz";     /**     * 获取字体     * @return     */    private Font getFont() {        return new Font("Times New Roman", Font.ROMAN_BASELINE, MagicNumConstant.FORTY);    }     /**     * 获取颜色     * @param fc     * @param bc     * @return     */    private Color getRandomColor(int fc, int bc) {         int fcc = Math.min(fc, MagicNumConstant.TWO_HUNDRED_FIFTY_FIVE);        int bcc = Math.min(bc, MagicNumConstant.TWO_HUNDRED_FIFTY_FIVE);         int r = fcc + random.nextInt(bcc - fcc - MagicNumConstant.SIXTEEN);        int g = fcc + random.nextInt(bcc - fcc - MagicNumConstant.FOURTEEN);        int b = fcc + random.nextInt(bcc - fcc - MagicNumConstant.TWELVE);         return new Color(r, g, b);    }     /**     * 绘制干扰线     * @param g     */    private void drawLine(Graphics g) {        int x = random.nextInt(width);        int y = random.nextInt(height);        int xl = random.nextInt(MagicNumConstant.TWENTY);        int yl = random.nextInt(MagicNumConstant.TEN);        g.drawLine(x, y, x + xl, y + yl);    }     /**     * 获取随机字符     * @param num     * @return     */    private String getRandomString(int num) {        int number = num > 0 ? num : randomString.length();        return String.valueOf(randomString.charAt(random.nextInt(number)));    }     /**     * 绘制字符串     * @param g     * @param randomStr     * @param i     * @return     */    private String drawString(Graphics g, String randomStr, int i) {        g.setFont(getFont());        g.setColor(getRandomColor(MagicNumConstant.ONE_HUNDRED_EIGHT, MagicNumConstant.ONE_HUNDRED_NINETY));        String rand = getRandomString(random.nextInt(randomString.length()));        String randomString = randomStr + rand;        g.translate(random.nextInt(MagicNumConstant.THREE), random.nextInt(MagicNumConstant.SIX));        g.drawString(rand, MagicNumConstant.FORTY * i + MagicNumConstant.TEN, MagicNumConstant.TWENTY_FIVE);        return randomString;    }     /**     * 生成随机图片,返回 base64 字符串     * @param     * @return     */    public Map getImgCodeBaseCode(int length) {        Map result = new HashMap<>();        // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);        Graphics g = image.getGraphics();        g.fillRect(0, 0, width, height);        // 获取颜色        g.setColor(getRandomColor(MagicNumConstant.ONE_HUNDRED_FIVE, MagicNumConstant.ONE_HUNDRED_EIGHTY_NINE));        // 获取字体        g.setFont(getFont());        // 绘制干扰线        for (int i = 0; i < lineSize; i++) {            drawLine(g);        }         // 绘制随机字符        String randomCode = "";        for (int i = 0; i < length; i++) {            randomCode = drawString(g, randomCode, i);        }        g.dispose();         result.put("imgCode", randomCode);         String base64Code = "";        try {            //返回 base64            ByteArrayOutputStream bos = new ByteArrayOutputStream();            ImageIO.write(image, "PNG", bos);             byte[] bytes = bos.toByteArray();            Base64.Encoder encoder = Base64.getEncoder();            base64Code = encoder.encodeToString(bytes);         } catch (Exception e) {            log.debug(e.getMessage());        }        result.put("data", _"data:image/png;base64," + base64Code);        return result;    } }

后台生成图片base64,和一个唯一的key(通过这个key判断是哪张图片),后台可以通过接口传给前端图片base64和key,前端输入验证码,传给后台key和验证码去校验验证。

package com.hengtiansoft.gxrc.base.service.impl; import com.hengtiansoft.gxrc.base.service.ImgCaptchaService;import com.hengtiansoft.gxrc.base.util.ImgCaptchaUtil;import com.hengtiansoft.gxrc.common.constant.MagicNumConstant;import com.hengtiansoft.gxrc.common.entity.exception.BusinessException;import com.hengtiansoft.gxrc.common.redis.RedisOperation;import com.hengtiansoft.gxrc.common.util.UUIDUtils;import org.apache.commons.lang3.ObjectUtils;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service; import java.util.Map; /** * @Description: * @Author: wu * @CreateDate: 2020/11/11 17:17 */@Servicepublic class ImgCaptchaServiceImpl implements ImgCaptchaService {     private static final String IMG_CAPTCHA = "imgCaptcha:";     @Autowired    private RedisTemplate redisTemplate;     @Autowired    private ImgCaptchaUtil imgCaptchaUtil;     @Override    public Map getImgCaptcha() {        RedisOperation redisOperation = new RedisOperation(redisTemplate);        Map map = imgCaptchaUtil.getImgCodeBaseCode(MagicNumConstant.FOUR);        String uuid = UUIDUtils.createUUID();        redisOperation.set(IMG_CAPTCHA + uuid, map.get("imgCode"));        redisOperation.expire(IMG_CAPTCHA + uuid, MagicNumConstant.THIRTY_THOUSAND);        map.remove("imgCode");        map.put("key", uuid);        return map;    }     @Override    public void checkImgCaptcha(String code, String key) {        RedisOperation redisOperation = new RedisOperation(redisTemplate);        String captcha = redisOperation.get(IMG_CAPTCHA + key);        if (ObjectUtils.isEmpty(captcha) || !StringUtils.equals(captcha, code)) {            throw new BusinessException("验证码错误");        }        redisOperation.del(IMG_CAPTCHA + key);    }}

到此,关于"Vue如何实现图片验证码生成"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

验证 生成 图片 干扰 字体 字符 前端 后台 背景 颜色 学习 最大 最小 字符串 最大值 随机数 输入 原点 坐标 容器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司 科技互联网企业 互联网科技资迅 互联网的科技创新 嘟嘟瓜互联网科技 青海省互联网新科技 安控科技rtu产品工业互联网 互联网系的金融科技公司 广州市恰铎互联网科技有限公司 中国科技创新与世界互联网大会 企晟互联网信息科技有限公司 广州有谷有贝互联网科技有限公司 广州燕处互联网科技有限公司 神州科技互联网有限公司 互联网时代科技型公司的机会 互联网科技收购价值 科技互联网经济论坛 互联网时代高科技布局 黑龙江互联网科技公司 小牛互联网科技有限公司地址 互联网科技工作委员会 科技金融是不是互联网金融 互联网的科技 上海喔噻互联网科技 太原新华互联网科技学校怎么样 安控科技rtu产品工业互联网 厦门比较好的科技互联网公司 亳州好赞互联网科技有限公司 福仕德教育科技互联网 保山浩联互联网科技有限公司
0