首先检查网络问题,网络正常。
打开控制台,发现验证码图片对应的响应状态码为500,是服务端的问题
由于服务端是将 jar 包通过 docker 部署的,所以通过
docker logs -f container_id
查看日志,发现验证码正确生成了,但是在 docker 容器中缺少图形化界面,不能正确加载验证码对应的字体(找不到对应的类)
原因:
1)在使用 kaptcha
库生成验证码的时候。kaptcha
使用了 AWT 来生成图像,而 Spring Boot 应用是在没有图形环境的情况下运行(例如在 Docker 容器中)时,这时尝试了加载图形组件。(解决方案是在 java 启动参数中添加参数 "-Djava.awt.headless=true",采用 headless 模式运行 java 应用 )
2)镜像里面没有验证码对应的字体
解决方案:
1)设置 Java 启动时为 headless 模式,以避免尝试加载不必要的图形组件。
2)在镜像中下载常用的字体包
修改 dockerfile 文件如下:
# 使用 Maven 镜像构建应用
FROM maven:3.8.5-openjdk-11 AS build
WORKDIR /app# 将 Maven 配置文件复制到容器中
COPY pom.xml .
COPY src ./src# 构建项目并打包
RUN mvn clean package -DskipTests# 使用 OpenJDK 运行应用
FROM openjdk:11-jre-slim
# 更换 Debian 源为清华大学镜像
RUN sed -i 's|http://deb.debian.org/debian|http://mirrors.tuna.tsinghua.edu.cn/debian|g' /etc/apt/sources.list
# 更新并安装 fontconfig 和常用字体
RUN apt-get update && \apt-get install -y --no-install-recommends fontconfig fonts-dejavu fonts-noto && \apt-get clean && rm -rf /var/lib/apt/lists/*WORKDIR /app
# 将构建的 jar 文件复制到运行环境中
COPY --from=build /app/target/computerstore-0.0.1-SNAPSHOT.jar app.jar# 暴露应用运行端口
EXPOSE 8086# 启动 Spring Boot 应用
ENTRYPOINT ["java", "-Djava.awt.headless=true", "-jar", "app.jar"]