addZuulRequestHeader 中文乱码
🏷️ Zuul
通过 RequestContext.addZuulRequestHeader
将用户信息的 JSON 格式数据传递给后端服务时中文出现了乱码。尝试设置了几个 Zuul 的配置项,没起作用,于是准备将数据改为使用 Base64 格式传递来避免乱码问题。
1. 将 JSON 字符串转为 Base64 格式的字符串:
java
import org.springframework.util.Base64Utils;
ctx.addZuulRequestHeader(RequestHeader.SSO_TOKEN,
Base64Utils.encodeToString(
objectMapper.toJSONString(ssoToken).getBytes(StandardCharsets.UTF_8)
)
);
1
2
3
4
5
6
7
2
3
4
5
6
7
2. 读取 Base64 格式的字符串转为 JSON 格式字符串:
java
import org.springframework.util.Base64Utils;
String tokenBase64 = request.getHeader(RequestHeader.SSO_TOKEN);
if (StringUtils.isNotEmpty(tokenBase64)) {
String tokenJson = new String(
Base64Utils.decodeFromString(tokenBase64),
StandardCharsets.UTF_8
);
SsoToken ssoToken = objectMapper.parseObject(tokenJson, SsoToken.class);
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
项目中没有 Base64Utils
工具类时可以使用 java.util.Base64
类来实现,示例代码如下:
java
import java.util.Base64;
String originalString = "Hello World!";
// 将字符串编码为 Base64
String encodedString = Base64.getEncoder().encodeToString(originalString.getBytes(StandardCharsets.UTF_8));
System.out.println("Encoded string: " + encodedString);
// 将 Base64 编码解码为字符串
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println("Decoded string: " + decodedString);
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
另外还搜到一种方案:通过 URLEncoder
对字符串编码,然后再通过 URLDecoder
解码(具体方法见这篇博客)。
编码:
javaRequestContext.getCurrentContext().addZuulRequestHeader("user", URLEncoder.encode(JSONObject.toJSONString(obj), "UTF-8") );
1
2
3解码:
javaString userStr = this.getRequest().getHeader("user"); User user = null; if (StringUtil.isNotNull(userStr)) { try { user = URLDecoder.decode(userStr, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }
1
2
3
4
5
6
7
8
9