【发布时间】:2021-09-01 11:37:01
【问题描述】:
如果密码包含(德语)变音符号,我如何配置 Java 11 HttpClient Authenticator 以正确编码密码?
这里是配置
String username = "testuser";
String password = "täst";
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
};
HttpClient build = HttpClient.newBuilder()//
.sslContext(disabledSslVerificationContext())//
.authenticator(authenticator).build();
String url = server + "/ping";
String body = "";
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)) //
.header("Content-Type", "application/json") //
.header("charset", "UTF-8") //
.method("GET", BodyPublishers.ofString(body)).build();
我也尝试设置 .header("Content-Type", "text/html; charset=utf-8") 但这也没有用。
如果我出于调试目的将“密码”添加到标题中,我会在服务上看到我收到 t?st 而不是 täst。
如何指示服务器以正确的形式向服务器发送密码?
[编辑]
调试代码表明 jdk.internal.net.http.AuthenticationFilter#response 看不到我的字符集设置。此调用最终将 isUTF8 保持为 false,如果我在调试器中将其切换为 true,则密码将正确发送到服务器。
for (String aval : authvals) {
HeaderParser parser = new HeaderParser(aval);
String scheme = parser.findKey(0);
if (scheme.equalsIgnoreCase("Basic")) {
authval = aval;
var charset = parser.findValue("charset");
isUTF8 = (charset != null && charset.equalsIgnoreCase("UTF-8"));
break;
}
}
我仍然没有找到指示 AuthenticationFilter 查看我的字符集设置的正确方法。有什么建议吗?
【问题讨论】:
-
尝试
\u00E4而不是ä。这将检测 javac 编译器是否使用与编辑器相同的字符集编码。 -
\u00E4 也不起作用。
标签: java authentication httpclient java-11