9

我正在做一些简单的 HTTP 身份验证并得到一个

java.lang.IllegalArgumentException: Illegal character(s) in message header value: Basic OGU0ZTc5ODBk(...trimmed from 76 chars...)
(...more password data...)

我认为这是因为我的用户名和密码很长,编码器用\n76 个字符将其包装起来。有什么办法可以解决这个问题吗?该 URL 仅支持 HTTP 基本身份验证。

这是我的代码:

private class UserPassAuthenticator extends Authenticator {
    String user;
    String pass;
    public UserPassAuthenticator(String user, String pass) {
        this.user = user;
        this.pass = pass;
    }

    // This method is called when a password-protected URL is accessed
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, pass.toCharArray());
    }
}

private String fetch(StoreAccount account, String path) throws IOException {
    Authenticator.setDefault(new UserPassAuthenticator(account.getCredentials().getLogin(), account.getCredentials().getPassword()));

    URL url = new URL("https", account.getStoreUrl().replace("http://", ""), path);
    System.out.println(url);

    URLConnection urlConn = url.openConnection();
    Object o = urlConn.getContent();
    if (!(o instanceof String)) 
        throw new IOException("Wrong Content-Type on " + url.toString());

    // Remove the authenticator back to the default
    Authenticator.setDefault(null);
    return (String) o;
}
4

4 回答 4

17

这似乎是Java 中的一个错误

您是否尝试过使用其他 HTTP 客户端,例如 Apache 的库?

还是不使用身份验证器,而是手动设置标头?

URL url = new URL("http://www.example.com/");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Authorization", "Basic OGU0ZTc5ODBkABcde....");

令牌值为 encodeBase64("username:password")。

于 2010-01-13T06:02:09.067 回答
1

这对我有用。

HttpsURLConnection con = null; con = (HttpsURLConnection) obj.openConnection(); 字符串编码 = Base64.getEncoder().encodeToString("username:password".getBytes(StandardCharsets.UTF_8)); con.setRequestProperty("授权","基本"+encoding.replaceAll("\n", ""));

于 2017-01-09T09:33:40.507 回答
0

我发现非法字符是由“授权:基本”引起的,编码应该是“授权”,“基本”+编码

于 2017-06-01T12:44:48.947 回答
0

从“授权:基本”,编码为“授权”,“基本”+编码解决了我在标题问题中的非法字符。

于 2020-06-08T05:11:12.903 回答