base64.getencoder()用于编码字节数组为base64字符串,base64.getdecoder()用于解码base64字符串为字节数组;jdk 8+内置,不可new实例,需调用静态工厂方法。

Java里用Base64.getEncoder()还是Base64.getDecoder()?
别被名字绕晕:这两个是配套的,getEncoder()负责把字节数组变成Base64字符串,getDecoder()干反向活。JDK 8+ 自带,不用引第三方包——但很多人一上来就写new Base64(),直接报错,因为Base64是工具类,构造器私有。
-
编码必须用
Base64.getEncoder().encodeToString(byte[]),传入byte[],返回String - 解码用
Base64.getDecoder().decode(String),传入Base64字符串,返回byte[] - 如果传入非法字符(比如多了空格、换行、非Base64字母),
decode()会抛IllegalArgumentException,不是IOException
为什么Base64.encodeToString()结果里有时带换行?
默认的Base64.getEncoder()是“MIME encoder”,每76个字符自动加
——这是RFC 2045规范要求的,但HTTP头、URL、JSON字段里根本不能有换行。你看到接口报Invalid base64,八成就是这俩字符在捣鬼。
- 要纯字符串(无换行/空格),改用
Base64.getUrlEncoder()或Base64.getEncoder()配合withoutPadding() -
getUrlEncoder()用-和_代替+和/,适合URL和文件名;但注意它默认不补等号(=),某些老系统可能认不出 - 如果必须兼容老协议且要无换行,用
Base64.getEncoder().withoutPadding(),但得确认接收方支持缺padding
Spring Boot里传Base64图片,Controller参数怎么接?
常见场景:前端用canvas.toDataURL()传data:image/png;base64,xxx,后端直接用@RequestParam String image接,结果decode()失败——因为开头那段data:...;base64,根本不是Base64内容。
- 先用
image.startsWith("data:")判断,再用substring(image.indexOf(",") + 1)截掉前缀 - 截完的字符串可能含空格或换行,建议
.replaceAll("[\s]", "")清理一遍再解码 - 别用
String.getBytes()去转原始字符串再解码——那是把Base64字符串当普通文本转字节,完全跑偏;必须对Base64字符串调用Base64.getDecoder().decode(...)
Base64不是加密,别把它当安全手段用
Base64只是编码,类似“把二进制转成可打印字符”的搬运工。用它“隐藏”密码、token或敏感字段,等于把钥匙贴在门上还说“我藏好了”。真正需要保密时,该AES加密就得AES加密,该JWT签名就得签名。
立即学习“Java免费学习笔记(深入)”;
- 如果你在配置文件里把数据库密码Base64一下,运维同事看一眼
echo "xxx" | base64 -d就全出来了 - HTTP传输中用Base64传token,中间人抓包照样能decode,毫无防护作用
- 唯一合理用途:让二进制数据能在纯文本协议(如HTTP header、JSON、XML)里安全传输,不被截断或误解析
真正难的是判断什么时候该用、什么时候不该用——尤其在团队里有人把Base64当成“简单加密”来用,改起来比修bug还费劲。










