最近线上出现一个问题,前后端交互时,某些情况下,会有中文乱码的问题。
解决思路:
1. 在后端先将中文转为 Base64 后再传递到前端(此中文在前端不做显示处理)。
2. 前端将参数再传递回后端时,后端解析 Base64 得到中文字符串。
package ygw.study.tool;
import org.apache.axiom.util.base64.Base64Utils;
import org.apache.commons.lang3.StringUtils;
import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;
/**
* <p>
* 自定义 Base64 工具类
* </p>
* <p>
* Copyright:.All rights reserved.
* </p>
* <p>
* Company:Zsoft
* </p>
* <p>
* CreateDate: 2022-08-16
* </p>
*
* @author YuGongWen
* @history Mender: YuGongWen;Date: 2022-08-16;
*/
public class MyBase64Utils {
/**
* 获取字符串的 Base64 字符串
* 由于【+】会被系统拦截器替换为空格,所以【+】会提前替换为 28343746
* 由于【=】会被系统拦截器替换为空格,所以【=】会提前替换为 87284389
* 由于【/】会被系统拦截器替换为空格,所以【/】会提前替换为 09903904
*
* @param inputStr
* @return
*/
public static String getBase64Str(String inputStr) {
if (StringUtils.isBlank(inputStr)) {
return inputStr;
}
String base64Str = Base64Utils.encode(inputStr.getBytes(StandardCharsets.UTF_8));
base64Str = StringUtils.replace(base64Str, "+", "28343746");
base64Str = StringUtils.replace(base64Str, "=", "87284389");
base64Str = StringUtils.replace(base64Str, "/", "09903904");
return base64Str;
}
/**
* 解码 Base64 字符串
* 由于【+】会被系统拦截器替换为空格,所以【+】会提前替换为 28343746
* 由于【=】会被系统拦截器替换为空格,所以【=】会提前替换为 87284389
* 由于【/】会被系统拦截器替换为空格,所以【/】会提前替换为 09903904
*
* @param base64Str
* @return
*/
public static String getStrByBase64(String base64Str) {
if (StringUtils.isBlank(base64Str)) {
return base64Str;
}
if (ifBase64Str(base64Str)) {
// nothing to do
} else {
// 非 Base64 格式,不做处理,直接返回
return base64Str;
}
base64Str = StringUtils.replace(base64Str, "28343746", "+");
base64Str = StringUtils.replace(base64Str, "87284389", "=");
base64Str = StringUtils.replace(base64Str, "09903904", "/");
byte[] decode = Base64Utils.decode(base64Str);
return new String(decode, StandardCharsets.UTF_8);
}
/**
* 判断字符串是否为 Base64 格式
*
* @param str
* @return
*/
public static boolean ifBase64Str(String str) {
if (StringUtils.isBlank(str)) {
return false;
}
String base64Pattern = "^([A-Za-z0-9+/])*([A-Za-z0-9+/]|[A-Za-z0-9+/]=|[A-Za-z0-9+/])$";
if (Pattern.matches(base64Pattern, str)) {
return true;
} else {
return false;
}
}
}
补充maven依赖配置
<!-- https://mvnrepository.com/artifact/org.apache.ws.commons.axiom/axiom-api -->
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
<version>1.2.13</version>
</dependency>