图形验证码属于老生常谈了,具体细节这里就不说了。生成图形验证码的办法非常多,今天讲解一种通过Kaptcha组件快速生成图形验证码的方法。
Kaptcha是谷歌开源的一款简单实用的图形验证码组件。我个人推荐它的最大原因是容易上手,采用约定大于配置的方式,快速契合到项目中。
话不多说,我们看看该如何使用它:
一、首先我们在springboot中引入以下maven组件:

1 <dependency>
2 <groupId>com.google.code.kaptcha</groupId>
3 <artifactId>kaptcha</artifactId>
4 <version>2.3</version>
5 </dependency>

如果上述组件你一直无法拉取下来的话,也可以用如下配置:

1  <dependency>
2 <groupId>com.github.penggle</groupId>
3 <artifactId>kaptcha</artifactId>
4 <version>2.3.2</version>
5 </dependency>

二、接着我们在springboot项目中加入对应的config配置类,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )这一步也可以配合配置中心来完成。它的作用是自动生成我们所需的config bean。
其中的配置项我们都可以选填,这里是只是一个参考,具体内容可见下文表

 1 @Component
2 public class KaptchaConfig {
3
4 @Bean
5 public DefaultKaptcha getDefaultKaptcha(){
6 com.google.code.kaptcha.impl.DefaultKaptcha defaultKaptcha = new com.google.code.kaptcha.impl.DefaultKaptcha();
7 Properties properties = new Properties();
8 properties.put("kaptcha.border", "no");
9 properties.put("kaptcha.textproducer.font.color", "red");
10 properties.put("kaptcha.image.width", "213");
11 properties.put("kaptcha.image.height", "88");
12 properties.put("kaptcha.textproducer.font.size", "45");
13 properties.put("kaptcha.session.key", "verifyCode");
14 properties.put("kaptcha.textproducer.char.space", "6");
15 properties.put("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.WaterRipple");
16 // properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
17 properties.put("kaptcha.background.clear.from", "yellow");
18 properties.put("kaptcha.background.clear.to", "green");
19 Config config = new Config(properties);
20 defaultKaptcha.setConfig(config);
21
22 return defaultKaptcha;
23 }
24 }

配置表

配置名 配置作用 默认值
kaptcha.border 图片边框,合法值:yes , no yes
kaptcha.border.color 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue. black
kaptcha.image.width 图片宽 200
kaptcha.image.height 图片高 50
kaptcha.producer.impl 图片实现类 com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl 文本实现类 com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string 文本集合,验证码值从此集合中获取 abcde2345678gfynmnpwx
kaptcha.textproducer.char.length 验证码长度 5
kaptcha.textproducer.font.names 字体 Arial, Courier
kaptcha.textproducer.font.size 字体大小 40px.
kaptcha.textproducer.font.color 字体颜色,合法值: r,g,b 或者 white,black,blue. black
kaptcha.textproducer.char.space 文字间隔 2
kaptcha.noise.impl 干扰实现类 com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color 干扰 颜色,合法值: r,g,b 或者 white,black,blue. black
kaptcha.obscurificator.impl

图片样式:<br />水纹 com.google.code.kaptcha.impl.WaterRipple <br />

鱼眼 com.google.code.kaptcha.impl.FishEyeGimpy <br />

阴影 com.google.code.kaptcha.impl.ShadowGimpy

com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl 背景实现类 com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from 背景颜色渐变,开始颜色 light grey
kaptcha.background.clear.to 背景颜色渐变, 结束颜色 white
kaptcha.word.impl 文字渲染器 com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.key session key KAPTCHA_SESSION_KEY
kaptcha.session.date session date KAPTCHA_SESSION_DATE
 
三、创建好config bean之后,我们就可以创建接口来生成验证码了 
controller类,新增接口:
 1     @GetMapping("/login/getVerifyCode")
2 public void getVerifyCode(String loginKey,
3 HttpServletRequest httpServletRequest,
4 HttpServletResponse httpServletResponse) {
5 try {
6 log.warn("query verify Code" + loginKey);
7 loadService.getVerifyCode(loginKey, httpServletRequest, httpServletResponse);
8 } catch (Exception e) {
9 log.error("get verify Code failed :", e);
10 }
11 }

service类,新增逻辑:

 1     public void getVerifyCode(String loginKey, HttpServletRequest httpServletRequest,
2 HttpServletResponse httpServletResponse) throws IOException {
3 ByteArrayOutputStream imgOutputStream = new ByteArrayOutputStream();
4 try {
5 //生产验证码字符串并保存到session中
6 String verifyCode = captchaProducer.createText();
7 // httpServletRequest.getSession().setAttribute("verifyCode", verifyCode); // 写入会话
8 //redisCache.setVerifyInfo(loginKey, verifyCode); //写入redis
9 captchaMap.put(loginKey, verifyCode);//写入内存
10 log.warn("reset verify code key {}, code {}", loginKey, verifyCode);
11 BufferedImage challenge = captchaProducer.createImage(verifyCode);
12 ImageIO.write(challenge, "jpg", imgOutputStream);
13 } catch (IllegalArgumentException | IOException e) {
14 httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
15 return;
16 }
17 byte[] captchaOutputStream = imgOutputStream.toByteArray();
18 httpServletResponse.setHeader("Cache-Control", "no-store");
19 httpServletResponse.setHeader("Pragma", "no-cache");
20 httpServletResponse.setDateHeader("Expires", 0);
21 httpServletResponse.setContentType("image/jpeg");
22 try (ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream()) {
23 responseOutputStream.write(captchaOutputStream);
24 responseOutputStream.flush();
25 } catch (IOException ex) {
26 log.error("find ex in create a new verify Code", ex);
27 }
28 }

相关代码全部开发完毕后,我们调用接口查看效果:

这里我发现一个在本地环境使用ok,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )但是在使用docker部署微服务时却存在的一个异常:

1 java.lang.NullPointerException: null
2 at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
3 at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
4 at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
5 .....

网上查了下,大致原因是由于我们本地使用的是oraclejdk,但是在docker中jdk的版本则采用的是openjdk。openjdk有些字体的支撑不是很友好,这里需要在制作docker镜像时添加如下语句解决:

1 RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig

 
 
 
 

Springboot通过谷歌Kaptcha 组件,生成图形验证码的更多相关文章

  1. C#生成图形验证码

    先看效果: 再上代码 public class CaptchaHelper { private static Random rand = new Random(); private static in ...

  2. PHP5 GD库生成图形验证码(汉字)

    PHP5 GD库生成图形验证码且带有汉字的实例分享. 1,利用GD库函数生成图片,并在图片上写指定字符imagecreatetruecolor 新建一个真彩色图像imagecolorallocate ...

  3. PHP5生成图形验证码(有汉字)

    利用PHP5中GD库生成图形验证码 类似于下面这样 1.利用GD库函数生成图片,并在图片上写指定字符 imagecreatetruecolor   新建一个真彩色图像      imagecolora ...

  4. java生成图形验证码

    效果图 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buf ...

  5. vue实现随机生成图形验证码

    效果展示 安装插件 npm i identify 定义组件 verificationCode.vue <template> <!-- 图形验证码 --> <div cla ...

  6. ASP.NET中如何生成图形验证码

    通常生成一个图形验证码主要 有3个步骤: (1)随机产生一个长度为N的随机字符串,N的值可由开发可由开发人员自行设置.该字符串可以包含数字.字母等. (2)将随机生成的字符串创建成图片,并显示. (3 ...

  7. Net Core 生成图形验证码

    1. NetCore ZKweb       在我第一次绘制图形验证码时是采用的ZKweb的绘制库,奉上代码参考      public byte[] GetVerifyCode(out string ...

  8. python 生成图形验证码

    文章链接:https://mp.weixin.qq.com/s/LYUBRNallHcjnhJb1R3ZBg 日常在网站使用过程中经常遇到图形验证,今天准备自己做个图形验证码,这算是个简单的功能,也适 ...

  9. (转)Android 之生成图形验证码

    import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; impor ...

  10. 【Java】生成图形验证码

    本章介绍一个能生成比较好看的图形验证码类 生成验证码工具类 package com.util; import java.awt.Color; import java.awt.Font; import ...

随机推荐

  1. leetcode-1072 Flip Columns For Maximum Number of Equal Rows

    Given a matrix consisting of 0s and 1s, we may choose any number of columns in the matrix and flip e ...

  2. SAP transformation特殊字符

    unicode 0000 在transformation中总被翻译成,这个转义在其他语法中不存在,所以总是报错.

  3. 抽风的Maven、maven插件及配置

    Idea 配合 Maven使用中有时遇到莫名奇妙的问题,又莫名奇妙的恢复正常.整理如下: 1.删除系统环境变量Maven_Home,只需在IDEA中指定Maven及settings.xml即可. 有时 ...

  4. Android日常--今日的APP进度+1

    学了这么久的APP,是时候拿出来实践一下啦! 今天洗的内容都比较基础,基本上不涉及到后台代码的编写,看到本阶段的目标需要连接数据库,也是有被震住哈哈哈哈哈: 我发现,第一阶段主要分为两个界面,第一个注 ...

  5. 对Android关联SDK后,还是无法显示那俩图标的解决

    显示出来!!!! 可以这么解决: 步骤一: 步骤二: 找到这个,在上方的栏里面: 步骤三: 将这四个选中: 步骤四: 然后选中这个栏: 步骤五: 选中Android: 步骤六: 最后,点击右下角的Ap ...

  6. Flink基本概念及架构

    1.基本概念 无界和有界数据.任何类型的数据都可以形成一种事件流.信用卡交易.传感器测量.机器日志.网站或移动应用程序上的用户交互记录,所有这些数据都形成一种流.数据可以被作为 无界 或者 有界 流来 ...

  7. 2023GDKOI总结

    2023GDKOI总结 说明:不是GD选手,只是因为来zsjz集训就顺便参加了GDKOI,不过也不参与GD选手排名. 考前看了看GDKOI2021的题,当时是考了3天,每天4题,而里面只有一道题是我一 ...

  8. ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  9. Windows7蓝牙音响连接成功,但是无法播放音乐,没有声音

    本人使用的蓝牙是博通94360CD的无线网卡集成的,在Windows7系统,成功安装蓝牙驱动,但是无论连接什么蓝牙音响设备,都可以连接成功,但是在音频管理却没有蓝牙音响的设备,自然就没有声音.后来找到 ...

  10. Windows10一劳永逸的禁止更新/恢复更新

    之前发表过一篇文章Windows10彻底关闭自动更新,这篇文章相对复杂了些.而且还是有一定几率会触发从而自动打开更新.下面讲的就是怎么一次性永久关闭更新,即使触发了更新,也不能下载更新,从而达到真正的 ...