有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有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) 个答案

  1. # 1 楼答案

    事实证明,utf-8中的编码功能只在Java 11之后的Java版本中添加,并由服务器响应头触发。因此,我们必须将服务器配置为在其响应中返回某个元素。由于我们目前无法做到这一点(因为我们必须使用Java 11),我们将密码编码为ISO_8859_1

        String encodedPW = new String(password.getBytes(), StandardCharsets.ISO_8859_1.toString());