由于jdk1.7和jdk1.8內置的Base64遵守的RFC協議不一致,jdk1.7按照照RFC1521實作的,jdk1.8是按照rfc4648和rfc2045兩個協議來實作的,具體可以從類注釋中查詢到,由于協議的不同可能導致jdk1.8的解碼jdk1.7編碼的資料時拋出java.lang.IllegalArgumentException: Illegal base64 character a例外.因此需要特別注意保持解碼編碼的一致性,
jdk7的編碼結果包含換行;
jdk8的編碼結果不包含換行;
jdk8無法解碼包含換行的編碼結果;
既然得知上述例外產生的由于,故找到解決方案也很簡單,
- 使用apache common包中的org.apache.commons.codec.binary.Base64類進行編碼和解碼;
- 編碼之后或解碼之前去除換行符;
- 編碼和解碼使用相同的jdk版本
JDK8 下兼容JDK7的解碼實作:
/**
* 換行.
*/
private static final String LINE_FEED = "\n";
/**
* 空串.
*/
private static final String EMPTY = "";
/**
* 解碼.
*/
public byte[] decode(final String str) {
if (Objects.isNull(str)) {
return null;
}
final String text = clearLineFeed(str);
final byte[] data = Base64.getDecoder().decode(text.getBytes(UTF_8));
return data;
}
/**
* 清理換行符.
* @param str
* @return
*/
private String clearLineFeed (final String str) {
if (str.contains(LINE_FEED)) {
return str.replaceAll(LINE_FEED, EMPTY);
}
return str;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/388428.html
標籤:其他
