图形验证码属于老生常谈了,具体细节这里就不说了。生成图形验证码的办法非常多,今天讲解一种通过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. 后台运行&和nohup使用

    这里首先先介绍一下 ctrl+z bg fg jobs 命令 下面为了观察效果,test1.sh脚本不停的输出hello ctrl + z ,会使一个正在运行的进程挂起(暂停)到后台,而且执行jobs ...

  2. [极客大挑战 2019]Upload 1

    进入可以看到,这时一道文件上传题目 直接上传test.php 提示Not image不是图片,可能是MIME绕过,尝试抓包修改Content-Type 提示Not php,猜测可能是检测后缀名不能是p ...

  3. PHP 文件和文件夹操作

    文件夹操作 创建文件夹 mkdir(名称,权限,递归创建):创建文件 例如: #创建文件夹 mkdir('./aa') # 创建 aa 文件夹 mkdir('./aa/bb') # 在 aa 目录下创 ...

  4. Ipmitool命令之ipmitool user(用户管理)

    常见的用户配置命令: (1)查看用户清单 root@master:~# ipmitool user list 1 ID Name Callin Link Auth IPMI Msg Channel P ...

  5. ⾼性能IO模型:为什么单线程Redis能那么快

      Redis是单线程,主要是指Redis的⽹络IO和键值对读写是由⼀个线程来完成的,这也是Redis对外提供键值存储服务的主要流程.但Redis的其他功能,⽐如持久化.异步删除.集群数据同步等,其实 ...

  6. odoo 开发入门教程系列-模型和基本字段

    模型和基本字段 在上一章的末尾,我们创建一个odoo模块.然而,此时它仍然是一个空壳,不允许我们存储任何数据.在我们的房地产模块中,我们希望将与房地产相关的信息(名称(name).描述(descrip ...

  7. java创建线程的方式有几种?

    java中创建线程的方式有多少种,这个问题也是众多纷纭,这个时候更应该参考官方文档(https://docs.oracle.com/javase/8/docs/api/java/lang/Thread ...

  8. VUE百度地图API调用(手机端、PC端、微信通用)

    百度地图API-示例中心: https://lbsyun.baidu.com/jsdemo.htm#aCreateMap 1.引入百度地图(此处用到的是V2.0版本) 1> 建立一个js文件,例 ...

  9. cs 保研经验贴 | 综合面试题库

    绝大部分夏令营都需要面试:如果幸运的话,稍微问几个问题就结束了:不幸的话,可能要抓住你做项目.读论文.复现.做 pre 等等. 这篇博客适用于幸运的情况:绝大部分学校的面试题库,都是彼此重合的,并且一 ...

  10. OpenWRT实现NAT64/DNS64

    OpenWRT实现NAT64/DNS64 连接到核心路由器 # 连接到核心路由器 [C:\~]$ ssh root@10.0.0.1 Connecting to 10.0.0.1:22... Conn ...