当前通过 org.apache.commons.codec.binary.Base64 库使用 Base64 转换。这是作为我们拥有的一些旧代币的一部分实现的,效果很好。我们目前正在尝试放弃这个库,并坚持在 utils 下使用 Java 8 内置的 Base64 库。但这不起作用,因为字符不匹配,如下所示。有没有办法解决这个问题(除了使用我绝对不想搞乱的正则表达式)?请指教。谢谢。
String value1 = org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString(aByteArray);
String value2 = java.util.Base64.getEncoder().encodeToString(aByteArray);
使用 org.apache.commons.codec.binary.Base64 库时的示例结果。
1111111111_22222_Some // value1
使用 java.util.Base64 库时的示例结果。
1111111111/22222/Some= // value2
请注意/和 _ 加上缺少 = 符号之间的区别。在不同的标记中,您会看到差异,例如 + 符号与 - 符号等。
我尝试了不填充和设置 StandardCharsets.UTF_8 来传递字节数组的选项,最终得到相同的不匹配结果。
最佳答案
org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString(aByteArray);
创建一个 URL 安全的 Base64 变体。 (使用 _ 和 - 作为编码的一部分)
使用java.util.Base64.getEncoder().encodeToString(aByteArray);
将创建“标准”base64,其中“/”“=”和“+”作为编码的一部分。这将是不安全的网址。
Base64 类有一个不同的编码器 (Base64.getUrlEncoder()
),用于 url 安全编码变体:
java.util.Base64.getUrlEncoder().encodeToString(aByteArray)
编辑:
删除可以使用的可选填充
java.util.Base64.getUrlEncoder().withoutPadding().encodeToString(aByteArray);
关于java - 使用不同 Base64 库时数据不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62373593/