事故背景:openjdk与jdk引发的惨案
项目测试初期,服务器使用了Docker的环境
Dockerfile文件如下
本地采用的是jdk8
当高高兴兴写好shell脚本并跑了起来的时候,前端那边开始出问题了,项目开始抛出异常(项目使用的是谷歌的),maven如下:
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
当时报错的时候,就很纳闷,究竟哪里出了问题,
后来发现
错误来自于这里,于是本地开始调试
本地swagger出现的base64,都能够解码成功
如下
后来大胆猜测了一下,openjdk的问题,因为之前出现过在生成Excel时候由于openjdk缺少字体库支持不能生成文件。
于是,把openjdk换成jdk8,它可以生成base64了!!!
它生成之后,就没管它了,直到前端小朋友再次去使用的时候,发现base64还是不能转成图片,如下:
接下来进入本文正题
事故:编码问题
当时出现这个问题的时候,自己也很纳闷,到底又是哪里出了问题?
于是乎,我将服务器上的base64与本地同样的base64做了对比,发现服务器中的base64编码中莫名其妙的出现了很多 ’ \ '这种特殊字符,于是,再次根据经验再次大胆猜测,可能是windows与linux的编码格式问题。
原来我的代码是这样的:
String captchaBase64 = "data:image/jpeg;base64," + base64.replaceAll("\r\n", "");
注意看后面的’ \r\n ’
由于linux的编码问题,我改成了
String captchaBase64 = "data:image/jpeg;base64," + base64.replaceAll("\r|\n", "");
这样就可以支持windows与linux了。
问题解决!