本案例基于SpringBoot构建,原理为后台生成base64的图片资源,前端HTML进行渲染

为简化代码偷懒,用到lombok ^_^

1.captcha版本选择,pom.xml中配置captcha依赖

<dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

2.captcha JavaConfig配置

a.在application.yml中配置captcha的属性

# Google Captcha Generator Settings(图片验证码生成器配置信息)
captcha:#是否有边框,默认为yes,可选"yes"、"no"(注:此处需要加双引号引起来,不然为被解析为Boolean类型true/false)border: "yes"#边框颜色border-color: 105,179,90#验证码字体颜色text-producer-font-color: blue#文本字符大小text-producer-font-size: 26#文本字体样式text-producer-font-names: 宋体,楷体,微软雅黑#验证码文本字符长度text-producer-char-length: 4#验证码文本字符间距text-producer-char-space: 5#图片宽度image-width: 88#图片高度image-height: 40

b.CaptchaConfiguration配置文件

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** Google Captcha Generator 图片验证码生成器配置类属性**/
@Data
@Component
@ConfigurationProperties(prefix = "captcha")
public class CaptChaConfigProperties {/*** 是否有边框,默认为yes,可选"yes"、"no"<br>* 注意:此处需要加双引号引起来,不然为被解析为Boolean类型true/false*/private String border;/*** 边框颜色*/private String borderColor;/*** 验证码字体颜色*/private String textProducerFontColor;/*** 文本字符大小*/private String textProducerFontSize;/*** 文本字体样式*/private String textProducerFontNames;/*** 验证码文本字符长度*/private String textProducerCharLength;/*** 验证码文本字符间距*/private String textProducerCharSpace;/*** 图片宽度*/private String imageWidth;/*** 图片高度*/private String imageHeight;
}
import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.impl.NoNoise;
import com.google.code.kaptcha.util.Config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Properties;/*** Google Kaptcha Generator 图片验证码生成器配置类**/
@Slf4j
@Configuration
public class KaptchaConfiguration {@Autowiredprivate CaptChaConfigProperties kaptChaConfigProperties;/*** DefaultKaptcha配置** @return*/@Bean(name = "kaptchaProducerMath")public DefaultKaptcha getKaptchaProducerMath() {DefaultKaptcha defaultKaptcha = new DefaultKaptcha();Properties properties = new Properties();// 是否有边框 默认为true 我们可以自己设置yes,noproperties.setProperty(Constants.KAPTCHA_BORDER, kaptChaConfigProperties.getBorder());// 边框颜色 默认为Color.BLACKproperties.setProperty(Constants.KAPTCHA_BORDER_COLOR, kaptChaConfigProperties.getBorderColor());// 验证码文本字符颜色 默认为Color.BLACKproperties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, kaptChaConfigProperties.getTextProducerFontColor());// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, kaptChaConfigProperties.getTextProducerFontNames());// 验证码文本字体大小properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, kaptChaConfigProperties.getTextProducerFontSize());// 验证码图片宽度 默认为200properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, kaptChaConfigProperties.getImageWidth());// 验证码图片高度 默认为50properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, kaptChaConfigProperties.getImageHeight());// 验证码文本生成器(自定义为KaptchaTextCreator类实现)properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_IMPL, KaptchaTextCreator.class.getName());// 验证码文本字符间距 默认为2properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE, kaptChaConfigProperties.getTextProducerCharSpace());// 验证码文本字符长度 默认为5properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, kaptChaConfigProperties.getTextProducerCharLength());// 干扰实现类 com.google.code.kaptcha.impl.NoNoiseproperties.setProperty(Constants.KAPTCHA_NOISE_IMPL, NoNoise.class.getName());// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple// 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy// 阴影com.google.code.kaptcha.impl.ShadowGimpyproperties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL, CustGimpy.class.getName());properties.setProperty(Constants.KAPTCHA_BACKGROUND_IMPL, CustBackground.class.getName());Config config = new Config(properties);defaultKaptcha.setConfig(config);log.info("Initialized Capture Code Generator: {}.", DefaultKaptcha.class.getName());return defaultKaptcha;}
}
import com.google.code.kaptcha.text.impl.DefaultTextCreator;
import java.util.Random;/*** Google Kaptcha Generator 图片验证码生成器自定义文本生成器**/
public class KaptchaTextCreator extends DefaultTextCreator {/*** 文本字符串*/private static final char[] TEXT = "abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNOPQRSTUVWXYZ".toCharArray();@Overridepublic String getText() {StringBuilder code = new StringBuilder();Random random = new Random();int length = this.getConfig().getTextProducerCharLength();for (int i = 0; i < length; i++) {int c = random.nextInt(TEXT.length);code.append(TEXT[c]);}return code.toString();}}
import com.google.code.kaptcha.GimpyEngine;
import com.google.code.kaptcha.util.Configurable;
import com.jhlabs.image.RippleFilter;
import com.jhlabs.image.ShadowFilter;import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.concurrent.ThreadLocalRandom;/*** 自定义样式*/
public class CustGimpy  extends Configurable implements GimpyEngine {private static ThreadLocalRandom random = ThreadLocalRandom.current();public CustGimpy() {}@Overridepublic BufferedImage getDistortedImage(BufferedImage baseImage) {BufferedImage distortedImage = new BufferedImage(baseImage.getWidth(), baseImage.getHeight(), BufferedImage.TYPE_INT_ARGB);Graphics2D graph = (Graphics2D)distortedImage.getGraphics();ShadowFilter shadowFilter = new ShadowFilter();shadowFilter.setRadius(2.732F);shadowFilter.setDistance(5.0F);shadowFilter.setOpacity(0.7F);shadowFilter.setShadowColor(randomColor().getRGB());RippleFilter rippleFilter = new RippleFilter();rippleFilter.setWaveType(0);BufferedImage effectImage = rippleFilter.filter(baseImage, null);effectImage = shadowFilter.filter(effectImage, null);graph.drawImage(effectImage, 0, 0, null, null);graph.dispose();// 干扰线drawLine(distortedImage);return distortedImage;}private void drawLine(BufferedImage image) {// 干扰线条数int num = random.nextInt(11,17);float factor = 1.732F;float noiseWith = random.nextFloat() * factor;Graphics2D g2 = (Graphics2D) image.getGraphics();for (int i = 0; i < num; i++) {int xFrom = random.nextInt(image.getWidth());int yFrom = random.nextInt(image.getHeight());int xTo = random.nextInt(image.getWidth());int yTo = random.nextInt(image.getHeight());g2.setStroke(new BasicStroke(noiseWith));g2.setBackground(randomColor());g2.setColor(randomColor());g2.drawLine(xFrom, yFrom, xTo, yTo);noiseWith = random.nextFloat() * factor;}}private Color randomColor() {int r = random.nextInt(0, 128);int g = random.nextInt(0, 192);int b = random.nextInt(0, 255);return new Color(r, g, b);}
}
import com.google.code.kaptcha.BackgroundProducer;
import com.google.code.kaptcha.util.Configurable;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;public class CustBackground extends Configurable implements BackgroundProducer {public CustBackground() {}public BufferedImage addBackground(BufferedImage baseImage) {int width = baseImage.getWidth();int height = baseImage.getHeight();BufferedImage imageWithBackground = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D graph = (Graphics2D)imageWithBackground.getGraphics();graph.fill(new Rectangle2D.Double(0.0D, 0.0D, width, height));graph.drawImage(baseImage, 0, 0, null);return imageWithBackground;}
}

3.生成图形验证码base64字符串

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.FastByteArrayOutputStream;
import com.google.code.kaptcha.Producer;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
/*** 图片验证码Service*/
@Service
public class CaptchaCodeService {@Autowiredprivate Producer producer;/*** 生成图片验证码文本code* <pre>* 前端使用方法:*  <img src="data:image/png;base64,"+imgBase64Code />*  imgBase64Code:图片二进制数组转换的base64编码*  </pre>* @return String*/public String generateCode() {String code = producer.createText();BufferedImage bufferedImage = producer.createImage(code);// 将生成的图片缓存到IO流程中FastByteArrayOutputStream os = new FastByteArrayOutputStream();try {ImageIO.write(bufferedImage, "jpg", os);} catch (IOException e) {throw new BusinessException("图形验证码生成异常");}// 将IO流中的图片字节码数组转换为base64编码,返回给前端String imageBase64Code = new BASE64Encoder().encode(os.toByteArray());return imageBase64Code;}
}

基于captcha的图形验证码实现相关推荐

  1. django图形验证码和邮件

    设计知识点: django验证码插件的使用 django发送邮件 form表单数据过滤,前端渲染,包括错误信息 一.图形验证码 1.准备工作 pip install django-simple-cap ...

  2. 图形验证码在携程的实践之路

    作者简介:闵杰,携程信息安全部产品经理.2015年加入携程,主要负责黑产防刷,验证码,反爬以及UGC方面的产品设计,关注在低成本的前提下,解决以上场景的实际问题.本文由携程技术中心投稿,微信公号ID: ...

  3. python+tensorflow+captcha库:基于TF快速破解验证码

    python+tensorflow+captcha库:基于TF快速破解验证码 点击打开链接:文章摘自 https://blog.csdn.net/tengxing007/article/details ...

  4. 《PHP基于GD库制作图形验证码》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

  5. laravel mews/captcha 图形验证码 前后端分离

    1. 说明:在laravel框架中使用验证码如果前后端分离,就不能使用session来保存和验证验证码正确与否,在网上找了很久终于找到解决办法: 2.原文档地址:https://segmentfaul ...

  6. 基于selenium实现12306的登录操作(图形验证码识别)

    说明 12306 会有如下一个图形验证码识别点击,所以必须得先点击正确图片,才能继续进行操作. 基本步骤 selenium打开对应网站,并进行截图 将图片截取出对应验证码所在图片 通过超级鹰识别出要点 ...

  7. 使用.Net Core实现的一个图形验证码

    SimpleCaptcha是一个使用简单,基于.Net Standard 2.0的图形验证码模块.它的灵感来源于Edi.Wang的这篇文章https://edi.wang/post/2018/10/1 ...

  8. 1024电商项目的邮箱验证码与图形验证码功能模块

    项目基于springcloudalibaba,模块功能大致概括就是登录页面的时候先完成图形验证码的校验,输入的数字和字母与图片上的相对应之后,会向对应的邮箱或手机号发送邮箱/短信验证码二次验证.这里展 ...

  9. 调用语音验证码的接口与图形验证码框架

    调用语音验证码的接口 语音验证码就是以打电话的方式,通过电话语音播报的方式把验证码告诉给用户,语音验证码使用的不多. 因为第三方的接口价格相对于短信验证码来说比较贵,并且效果一般,只能发送纯数字的语音 ...

最新文章

  1. 分摊的意思_会计分摊是什么意思
  2. java设计模式之【策略模式】
  3. 若依集成CIM(即时推送系统)实现将服务端修改为SpringBoot+Vue前后端分离版(文末见代码下载)
  4. java kotlin lateinit_kotlin - 如何检查“lateinit”变量是否已初始化?
  5. 极域电子书包课堂管理系统_【君莲微讯】君莲学校(小学部)开展电子书包第13共同体数学研讨活动...
  6. linux文件管理 - 系统目录结构
  7. java php json转字符串_php json字符串转为数组或对象
  8. android q桌面,Android Q带来全新桌面模式
  9. 随想录(我们的竞争力)
  10. java辅助百度贴吧_【图片】【共同上进】新手java代码辅助代写贴,新手福音! 申精!_java吧_百度贴吧...
  11. Corporate Action Guidelines Terms
  12. windows安装linux无法启动服务,安装centos后无法引导启动windows7怎么办
  13. 如何使用阿里云打造离线下载服务器?
  14. 3.IIC总线介绍及使用
  15. 解决问题multiply defined
  16. 在《2000年通则》中,根据卖方承担义务的不同,将13种贸易术语划分为下列四组:...
  17. 武科大计算机学院毕业生薪资,扎薪丨2018高校毕业生薪酬排行榜发布!华科排64、武大排90,非北上广还能去吗?...
  18. android模拟器mac版本下载,MaxMac电脑版怎么下载 安卓模拟器电脑版下载地址
  19. CRF和CQP的区别
  20. 三分钟读懂客户端证书

热门文章

  1. kubesphere多节点安装出错
  2. 万能视频格式转换器是一款功能强大的全能视频格式转换软件,支持多种视频格式转换。万能视频转换器可以将R...
  3. HTML5、CSS3基础笔记
  4. CNN Attention
  5. Foxit Reader以及Foxit Phantom如何设置页面固定大小
  6. 解决网络正常状态下QQ,tim登录超时问题
  7. 变频器,逆变器工作原理
  8. 在Linux系统中实现一个可加载的内核模块
  9. 计算机主机温度,电脑温度太高,如何冷却电脑?
  10. 如何让IE下载时下载内容自动跳转到迅雷等下载软件中