Vue如何实现图片验证码生成
发表于:2025-11-18 作者:千家信息网编辑
千家信息网最后更新 2025年11月18日,这篇文章主要介绍"Vue如何实现图片验证码生成",在日常操作中,相信很多人在Vue如何实现图片验证码生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Vue如何实现图片
千家信息网最后更新 2025年11月18日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安全错误
数据库的锁怎样保障安全
高级数据库难学吗
锐取YN200录播服务器
修订完善网络安全应急预案
pcs7服务器数据
数据库主要技术指标
基岩版如何增加服务器地址
售电系统显示数据库无此用户
陕西鲲鹏系列服务器如何挑选
手机网络安全现状
sql 数据库名称已存在
服务器开机显示正在使用
网络技术在军事上的应用
智联网络技术有限公司是国企吗
上海狼防网络技术有限公司
云服务器和电脑速度
千万人在线需要多少服务器
学校网络安全讲话
深圳维修服务器
上海注册网络技术有限公司
包头软件开发销售价格
网络安全漏洞如何修补
ps数据库怎么写
存储空间服务器
网络安全保障能力建设
数据库国考15年四月份
计算机网络技术怎么改主机名称
注册网络安全的公司
长沙思信网络技术有限公司
数据通信ip网络技术实训心得
服务器怎么工作