- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
图形验证码属于老生常谈了,具体细节这里就不说了。生成图形验证码的办法非常多,今天讲解一种通过Kaptcha组件快速生成图形验证码的方法。 Kaptcha是谷歌开源的一款简单实用的图形验证码组件。我个人推荐它的最大原因是容易上手,采用约定大于配置的方式,快速契合到项目中。 话不多说,我们看看该如何使用它: 1、首先我们在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 >
2、接着我们在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 |
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组件,生成图形验证码的文章就讲到这里了,如果你想了解更多关于Springboot通过谷歌Kaptcha组件,生成图形验证码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试使用以下 keytool 命令为我的应用程序生成 keystore : keytool -genkey -alias tomcat -keystore tomcat.keystore -ke
编辑:在西里尔正确解决问题后,我注意到只需将生成轴的函数放在用于生成标签的函数下面就可以解决问题。 我几乎读完了 O'Reilly 书中关于 D3.js 的教程,并在倒数第二页上制作了散点图,但是当添
虽然使用 GraphiQL 效果很好,但我的老板要求我实现一个用户界面,用户可以在其中通过 UI 元素(例如复选框、映射关系)检查呈现给他们的元素并获取数据,这样做将为该人生成 graphql 输入,
我尝试在 Netbean 6.8 中使用 ws-import 生成 Java 类。我想重新生成 jax-ws,因为在 ebay.api.paypalapi 包中发现了一个错误(我认为该错误是由于 Pa
我有一个 perl 脚本,它获取系统日期并将该日期写入文件名。 系统日期被分配给 TRH1 变量,然后它被设置为一个文件名。 $TRH1 =`date + %Y%m%d%H%M`; print "TR
我是 Haskell 的新手,需要帮助。我正在尝试构建一种必须具有某种唯一性的新数据类型,因此我决定使用 UUID 作为唯一标识符: data MyType = MyType { uuid ::
我制作了一个脚本,它可以根据 Mysql 数据库中的一些表生成 XML。 该脚本在 PHP 中运行。 public function getRawMaterials($apiKey, $format
所以这是我的项目中的一个问题。 In this task, we will use OpenSSL to generate digital signatures. Please prepare a f
我在 SAS LIFEREG 中有一个加速故障时间模型,我想绘制它。因为 SAS 在绘图方面非常糟糕,我想实际重新生成 R 中曲线的数据并将它们绘制在那里。 SAS 提出了一个尺度(在指数分布固定为
我正在为 Django 后端制作一个样板,并且我需要能够使它到达下一个下载它的人显然无法访问我的 secret key 的地方,或者拥有不同的 key 。我一直在研究一些选项,并在这个过程中进行了实验
我正在创建一个生成采购订单的应用程序。我可以根据用户输入的详细信息创建文本文件。我想生成一个看起来比普通文本文件好得多的 Excel。有没有可以在我的应用程序中使用的开源库? 最佳答案 目前还没有任何
我正在尝试使用 ScalaCheck 为 BST 创建一个 Gen,但是当我调用 .sample 方法时,它给了我 java.lang.NullPointerException。我哪里错了? seal
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我尝试编写一些代码,例如(在verilog中): parameter N = 128; if (encoder_in[0] == 1) begin 23 binary_out = 1;
我正忙于在 Grails 项目中进行从 MySQL 到 Postgres 的相当复杂的数据迁移。 我正在使用 GORM 在 PostGres 中生成模式,然后执行 MySQL -> mysqldump
如何使用纯 XSLT 生成 UUID?基本上是寻找一种使用 XSLT 创建独特序列的方法。该序列可以是任意长度。 我正在使用 XSLT 2.0。 最佳答案 这是一个good example 。基本上,
我尝试安装.app文件,但是当我安装并单击“同步”(在iTunes中)时,我开始在设备上开始安装,然后停止,这是一个问题,我不知道在哪里,但我看到了我无法解决的奇怪的事情: 最佳答案 似乎您没有在Xc
自从我生成 JavaDocs 以来已经有一段时间了,我确信这些选项在过去 10 年左右的时间里已经得到了改进。 我能否得到一些有关生成器的建议,该生成器将输出类似于 .Net 文档结构的 JavaDo
我想学习如何生成 PDF,我不想使用任何第三方工具,我想自己用代码创建它。到目前为止,我所看到的唯一示例是我通过在第 3 方 dll 上打开反射器查看的代码,以查看发生了什么。不幸的是,到目前为止我看
我正在从 Epplus 库生成 excel 条形图。 这是我成功生成的。 我的 table 是这样的 Mumbai Delhi Financial D
我是一名优秀的程序员,十分优秀!