解决若依ruoyi项目部署到服务器验证码接口报错的问题

这里写目录标题

ruoyi-vue项目部署到服务器验证码接口报500的解决方案

问题回顾

最近手上有个项目是基于ruoyi-vue开发的,本地运行的好好地,一部署到服务器上,运行成功,一访问就发现验证码接口报错!!!就有了如下画面:

测试:验证码怎么不显示?报错了呀!

你:😳纳尼?我本地好好的呀,什么也没改怎么报错了呢!!!

运维:包是你打包给我的呀!

你:😭你把服务器项目错误日志发我看下吧!

报错信息

验证码接口返回错误响应如下:

json 复制代码
{
    "msg": null,
    "code": 500
}

服务器项目错误日志如下:

log 复制代码
[XNIO-1 task-1] ERROR c.h.f.w.e.GlobalExceptionHandler - [handleRuntimeException,93] - 请求地址'/captchaImage',发生未知异常.
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)
	at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
	at sun.font.SunFontManager$2.run(SunFontManager.java:441)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.font.SunFontManager.<init>(SunFontManager.java:386)
	at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
	at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at java.lang.Class.newInstance(Class.java:442)
	at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
	at java.awt.Font.getFont2D(Font.java:491)
	at java.awt.Font.access$000(Font.java:224)
	at java.awt.Font$FontAccessImpl.getFont2D(Font.java:228)
	at sun.font.FontUtilities.getFont2D(FontUtilities.java:200)
	at sun.font.StandardGlyphVector.initFontData(StandardGlyphVector.java:1126)
	at sun.font.StandardGlyphVector.init(StandardGlyphVector.java:1115)
	at sun.font.StandardGlyphVector.<init>(StandardGlyphVector.java:167)
	at java.awt.Font.createGlyphVector(Font.java:2549)
	at com.google.code.kaptcha.text.impl.DefaultWordRenderer.renderWord(DefaultWordRenderer.java:67)
	at com.google.code.kaptcha.impl.DefaultKaptcha.createImage(DefaultKaptcha.java:43)

分析和解决方案

根据报错信息,可以看出发生了NullPointerException异常,具体原因可能是在创建验证码图片时出现了空指针异常。报错信息中涉及到了字体管理相关的代码,所以极可能是在获取字体信息时出现了问题。

我们看到报错信息,可以看出问题出现在获取字体版本信息时:

log 复制代码
	at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)

所以我们可以很明显的确定,服务器环境缺少相关字体文件或字体配置文件,导致无法获取字体版本信息;解决方法也很简单,缺少字体我们把字体安装上不就完事了,立马开干!

解决方案

这里我们操作的服务器是Centos7.9

我们先安装下字体库

bash 复制代码
# 更新软件包列表
sudo yum update
# 安装fontconfig字体库
sudo yum install fontconfig
# 安装ttf-dejavu字体
sudo yum install dejavu-sans-fonts

安装完成,我们查看下已经安装的字体库列表

bash 复制代码
fc-list

通过上面的命令我们可以看到刚安装上的DejaVu相关字体

安装完字体后,我们需要重启下项目服务,然后访问服务的验证码接口/captchaImage

响应结果:

json 复制代码
{
    "msg": "操作成功",
    "img": "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",
    "code": 200,
    "captchaEnabled": true,
    "uuid": "39ca65c4404a4bd8ab10f6671d4506a1"
}

到这里,完美解决!!!

相关推荐
Flittly14 小时前
【SpringSecurity新手村系列】(3)自定义登录页与表单认证
java·笔记·安全·spring·springboot
向葭奔赴♡1 天前
若依AES加密
ruoyi
Flittly2 天前
【SpringSecurity新手村系列】(2)整合 MyBatis 实现数据库认证
java·安全·spring·springboot·安全架构
极光代码工作室2 天前
基于SpringBoot的在线考试系统
java·springboot·web开发·后端开发
YDS8293 天前
大营销平台 —— 抽奖规则决策树
java·springboot·ddd
码农张34 天前
自定义跨字段校验必填注解
springboot
格鸰爱童话4 天前
向AI学习项目技能(七)
学习·springboot
代码漫谈4 天前
微服务 vs 单体架构:架构选型、实战拆解与决策指南
java·微服务·springboot·springcloud
文慧的科技江湖4 天前
光储充一体化系统落地 PRD 全功能清单 - 慧知开源充电桩平台
java·mysql·开源·springboot·慧知开源充电桩平台·充电重复订单解决方案源码
Flittly5 天前
【SpringAIAlibaba新手村系列】(16)调用百度 MCP 服务
java·笔记·spring·ai·springboot