Springboot通過谷歌Kaptcha?組件生成圖形驗證碼功能
圖形驗證碼屬于老生常談了,具體細節(jié)這里就不說了。生成圖形驗證碼的辦法非常多,今天講解一種通過Kaptcha組件快速生成圖形驗證碼的方法。
Kaptcha是谷歌開源的一款簡單實用的圖形驗證碼組件。我個人推薦它的最大原因是容易上手,采用約定大于配置的方式,快速契合到項目中。
話不多說,我們看看該如何使用它:
一、首先我們在springboot中引入以下maven組件:
<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
</dependency>如果上述組件你一直無法拉取下來的話,也可以用如下配置:
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>二、接著我們在springboot項目中加入對應的config配置類,(防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )這一步也可以配合配置中心來完成。它的作用是自動生成我們所需的config bean。
其中的配置項我們都可以選填,這里是只是一個參考,具體內(nèi)容可見下文表
@Component
public class KaptchaConfig {
@Bean
public DefaultKaptcha getDefaultKaptcha(){
com.google.code.kaptcha.impl.DefaultKaptcha defaultKaptcha = new com.google.code.kaptcha.impl.DefaultKaptcha();
Properties properties = new Properties();
properties.put("kaptcha.border", "no");
properties.put("kaptcha.textproducer.font.color", "red");
properties.put("kaptcha.image.width", "213");
properties.put("kaptcha.image.height", "88");
properties.put("kaptcha.textproducer.font.size", "45");
properties.put("kaptcha.session.key", "verifyCode");
properties.put("kaptcha.textproducer.char.space", "6");
properties.put("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.WaterRipple");
// properties.put("kaptcha.textproducer.font.names", "宋體,楷體,微軟雅黑");
properties.put("kaptcha.background.clear.from", "yellow");
properties.put("kaptcha.background.clear.to", "green");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}配置表
| 配置名 | 配置作用 | 默認值 |
| 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 | 圖片實現(xiàn)類 | com.google.code.kaptcha.impl.DefaultKaptcha |
| kaptcha.textproducer.impl | 文本實現(xiàn)類 | 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 | 干擾實現(xiàn)類 | 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 | 背景實現(xiàn)類 | 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 |
三、創(chuàng)建好config bean之后,我們就可以創(chuàng)建接口來生成驗證碼了controller類,新增接口:
@GetMapping("/login/getVerifyCode")
public void getVerifyCode(String loginKey,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
try {
log.warn("query verify Code" + loginKey);
loadService.getVerifyCode(loginKey, httpServletRequest, httpServletResponse);
} catch (Exception e) {
log.error("get verify Code failed :", e);
}
}service類,新增邏輯:
public void getVerifyCode(String loginKey, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws IOException {
ByteArrayOutputStream imgOutputStream = new ByteArrayOutputStream();
try {
//生產(chǎn)驗證碼字符串并保存到session中
String verifyCode = captchaProducer.createText();
// httpServletRequest.getSession().setAttribute("verifyCode", verifyCode); // 寫入會話
//redisCache.setVerifyInfo(loginKey, verifyCode); //寫入redis
captchaMap.put(loginKey, verifyCode);//寫入內(nèi)存
log.warn("reset verify code key {}, code {}", loginKey, verifyCode);
BufferedImage challenge = captchaProducer.createImage(verifyCode);
ImageIO.write(challenge, "jpg", imgOutputStream);
} catch (IllegalArgumentException | IOException e) {
httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
byte[] captchaOutputStream = imgOutputStream.toByteArray();
httpServletResponse.setHeader("Cache-Control", "no-store");
httpServletResponse.setHeader("Pragma", "no-cache");
httpServletResponse.setDateHeader("Expires", 0);
httpServletResponse.setContentType("image/jpeg");
try (ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream()) {
responseOutputStream.write(captchaOutputStream);
responseOutputStream.flush();
} catch (IOException ex) {
log.error("find ex in create a new verify Code", ex);
}
}相關代碼全部開發(fā)完畢后,我們調(diào)用接口查看效果:

這里我發(fā)現(xiàn)一個在本地環(huán)境使用ok,(防盜連接:本文首發(fā)自http://www.cnblogs.com/jilodream/ )但是在使用docker部署微服務時卻存在的一個異常:
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
.....網(wǎng)上查了下,大致原因是由于我們本地使用的是oraclejdk,但是在docker中jdk的版本則采用的是openjdk。openjdk有些字體的支撐不是很友好,這里需要在制作docker鏡像時添加如下語句解決:
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig
到此這篇關于Springboot通過谷歌Kaptcha 組件生成圖形驗證碼功能的文章就介紹到這了,更多相關Springboot圖形驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot如何實現(xiàn)定時任務的動態(tài)增刪啟停詳解
這篇文章主要給大家介紹了關于Spring Boot如何實現(xiàn)定時任務的動態(tài)增刪啟停的相關資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2020-07-07
java操作mongodb時,對象bean和DBObject相互轉換的方法(推薦)
下面小編就為大家?guī)硪黄猨ava操作mongodb時,對象bean和DBObject相互轉換的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11
SpringDataRedis入門和序列化方式解決內(nèi)存占用問題小結
spring-data-redis是spring-data模塊的一部分,專門用來支持在spring管理項目對redis的操作,這篇文章主要介紹了SpringDataRedis入門和序列化方式解決內(nèi)存占用問題,需要的朋友可以參考下2022-12-12
java向數(shù)據(jù)庫插入數(shù)據(jù)顯示亂碼的幾種問題解決
這篇文章主要給大家介紹了關于java向數(shù)據(jù)庫插入數(shù)據(jù)顯示亂碼問題的解決方案,文章分別羅列了前臺亂碼的問題、前臺先后臺插入數(shù)據(jù)后臺接收到的數(shù)據(jù)是亂碼以及后臺向數(shù)據(jù)庫插入數(shù)據(jù)是亂碼等幾種情況,需要的朋友可以參考下2021-11-11

