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

    Log4j是Apache下的一款开源的日志框架,能够满足我们在项目中对于日志记录的需求.一般来讲,在项目中,我们会结合slf4j和log4j一起使用.Log4j提供了简单的API调用,强大的日志格式定 ...

  2. Java 面试手撕代码

    1. 判断括号有效性 public static boolean fun5(String str) { HashMap<Character, Character> hashMap = ne ...

  3. 关于Android开发工具的下载之SDK篇

    SDK的下载 需要注意的是,如果我们使用的是Eciplise工具的话,那我们需要下载版本较低的android SDK tools, 在这里把下载链接放在这里啦:https://link.csdn.ne ...

  4. windows 系统下 workerman 在同一个运行窗口中开启多个 websocket 服务

    目录 开启多个 ws 服务失败 开启服务失败解决办法 同一个窗口中运行 开启多个 ws 服务失败 正常情况下,如果你想开启多个 websocket 服务的话 只要在一个文件中,输入 new Worke ...

  5. P7961 数列 题解

    对模拟的过程不敏感,对范围的数字不敏感 手玩是发现规律的好方式 计数 dp 以及一众计数题是明显短板,需要加紧突破. 样例解释已经较为明显地提示了这道题的大致做法.对于计数题,有动归与组合数学两种方法 ...

  6. C/C++ 恨透了 double free or corruption

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IwSVImp5cOB3gZbaf0YiPw 写过 C/C++ 的都 ...

  7. Sping Security前后端分离两种方案

    前言 本篇文章是基于Spring Security实现前后端分离登录认证及权限控制的实战,主要包括以下四方面内容: Spring Seciruty简单介绍: 通过Spring Seciruty实现的基 ...

  8. c++与linux详细计划,精确到每一天(仅80天)

    好的,以下是三个月中每一天的学习计划: 第一个月: 第1天:阅读C++教程,熟悉环境,了解基本语法和数据类型 第2天:编写Hello World程序,加深对C++环境的了解 第3天:学习函数的定义和调 ...

  9. 电商平台趋势妙手采集类API接口

    电商平台趋势,平台化.大家可以看到大的电商都开始有自己的平台,其实这个道理很清楚,就是因为这是充分利用自己的流量.自己的商品和服务大效益化的一个过程,因为有平台,可以利用全社会的资源弥补自己商品的丰富 ...

  10. [Linux]CentOS7:创建OS用户+授予sudo权限

    1 创建OS用户+授予sudo权限 Step1 下载安装Xshell.Xftp工具 Step2 通过Xshell,远程登陆服务器root用户 Step3 使用检查用户的命令查询当前linux环境是否存 ...