Vue如何实现图片验证码生成
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍"Vue如何实现图片验证码生成",在日常操作中,相信很多人在Vue如何实现图片验证码生成问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Vue如何实现图片
千家信息网最后更新 2025年02月02日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 MapgetImgCodeBaseCode(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 RedisTemplateredisTemplate; @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安全错误
数据库的锁怎样保障安全
助力万物互联网服务器图片
2021年网络安全博览会主题
中化创新科技城互联网总部大厦
查询数据库表格内容
防网络安全教育讲稿
深圳商城软件开发收费
藁城软件开发项目管理在线咨询
ibm数据库认证
什么服务器玩3a大作
软件开发的售后服务期限
历届网络安全宣传周主题
数据库谓词名词解释
华为台式机和服务器主板哪个好
食谱软件开发背景
数据库保存上传文件信息
软件开发拿来主义的优势
excel连接ora数据库
天津戴尔服务器
惠州小程序软件开发
c 数据库入门经典下载
数据库怎么搜索利润
通州区技术软件开发服务价钱
网络技术PPDRRM
网络安全类书记
软件开发java教程
hpe服务器ai管理工具
邯郸互联网软件开发要多少钱
教务管理系统数据库的创建和管理
机架式服务器长度
手机服务器故障排除