我正在执行一些简单的HTTP身份验证,并得到一个
java.lang.IllegalArgumentException: Illegal character(s) in message header value: Basic OGU0ZTc5ODBk(...trimmed from 76 chars...)
(...more password data...)
我认为这是由于我的用户名和密码非常长,编码器用\n
将其包装为76个字符。有什么办法可以解决这个问题?该网址仅支持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;
}
这似乎是bug in Java。
您是否尝试过使用其他HTTP客户端,例如Apache的库?
或者不是使用身份验证器,而是手动设置标题?
URL url = new URL("http://www.example.com/");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Authorization", "Basic OGU0ZTc5ODBkABcde....");
令牌值是encodeBase64(“ username:password”)。
这对我有用。
HttpsURLConnection con = null;con =(HttpsURLConnection)obj.openConnection();字符串编码= Base64.getEncoder()。encodeToString(“ username:password” .getBytes(StandardCharsets.UTF_8));con.setRequestProperty(“ Authorization”,“ Basic” + encoding.replaceAll(“ \ n”,“”));
[我发现非法字符是由“授权:基本”引起的,已编码其中应为“授权”,“基本” +编码
从“授权:基本”更改为“授权”,“基本” +编码解决了标题问题中的非法字符。