公司做一个运营平台登录页面需要增加一个验证码,前后端分离,后端使用springboot mybatis redis 把自己遇到的问题和一些解决办法整理出来
验证码生成不难 一会就能做完 开始行动首先添加maven 依赖
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
Controller里面代码入下
//生成文字验证码
String text = defaultKaptcha.createText();
// 生成图片验证码
ByteArrayOutputStream outputStream = null;
BufferedImage image = defaultKaptcha.createImage(text);
outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", outputStream);
BASE64Encoder encoder = new BASE64Encoder();
// 转base64 返回给前台
Map<String, Object> map = captchaService.createToken(text);
map.put("img", encoder.encode(outputStream.toByteArray()).replace("\n", "").replace("\r", ""));
本地测试接口返回正常
提交代码 上测试环境 调用验证码接口报错 异常如下
java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java 1264)
几经周转发现操作系统没有FontConfig组件,既然没有可以不可以找一个验证码生成自带字体方法,测试不行,看来需要安装。
解决办法 安装相应组件
yum install fontconfig
fc-cache –force
另外如果特殊情况 服务器系统不可以改动 可以预先生成好一些base64的验证码 存放到数据库 前端调用接口读取数据随机取一条