带有Umlauts的java HttpClient身份验证程序
如果密码包含(德语)umlauts,如何配置Java 11 HttpClient验证器以正确编码密码
以下是配置
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();
我也试过设置。标题(“内容类型”、“文本/html;字符集=utf-8”),但这也不起作用
如果我为了调试目的在标题中添加“password”,我会在收到t的服务上看到吗?而不是täst
如何指示服务器将正确形式的密码发送到服务器
[编辑]
调试代码表明jdk。内部的网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查看我的字符集设置的正确方法。有什么建议吗
# 1 楼答案
事实证明,utf-8中的编码功能只在Java 11之后的Java版本中添加,并由服务器响应头触发。因此,我们必须将服务器配置为在其响应中返回某个元素。由于我们目前无法做到这一点(因为我们必须使用Java 11),我们将密码编码为ISO_8859_1