Ответ 1
Проблема не входит в код библиотеки java.net
(EDIT: конечно, для базовых прокси HTTP, я еще не смог протестировать прокси-серверы NTLM). Код java.net
может подключаться отлично, используя пароли с "@" в них. Я привел демо-код ниже, который позволяет вам проверить это требование.
Вам не нужно избегать строкового значения, которое вы передаете в java.net.PasswordAuthentication
, вы должны передать свой пароль открытым текстом. Код библиотеки java.net
позаботится о необходимости кодирования вашего пароля при отправке по сети через прокси-сервер (см. Демонстрационный код ниже, чтобы проверить это требование).
Я считаю, что ваша проблема должна быть в том, как вы настраиваете свою систему за пределами кода, который вы включили в вопрос до сих пор.
Например, передали ли вы прокси-имя хоста JVM или соседней системе таким образом, что это путано с символом "@" ?
Пожалуйста, можете ли вы предоставить больше контекста?
Демо-код для проверки того, что код библиотеки java.net может справиться с "@" в пароле
Этот код содержит инструкции по настройке Fiddler2 в качестве прокси-сервера HTTP на вашем локальном компьютере, настройке Fiddler2 для запроса пароля и подключении через этот прокси-сервер с использованием классов библиотеки java.net.
Код работает успешно для меня как есть, и не удается, если я изменю переменную "пароль" на неверный пароль.
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.util.Base64;
public class q45749081 {
public static void main(String[] args) throws Exception {
// Start Fiddler HTTP proxy https://www.telerik.com/download/fiddler
// Click "rules" -> "require proxy authentication"
// Type into the "QuickExec" box below Fiddler Web Sessions list:
// prefs set fiddler.proxy.creds dXNlcm5hbWU6cEBzc3dvcmQ=
//
// This sets Fiddler to require auth with "username", "[email protected]"
//
// See https://stackoverflow.com/info/18259969/changing-username-and-password-of-fiddler-proxy-server
// Note that you must start a new process each time you change the password
// here, as sun.net.www.protocol.http.HttpURLConnection caches the proxy password
// for the lifetime of the JVM process
String password = "[email protected]";
System.out.println(
"prefs set fiddler.proxy.creds " +
Base64.getEncoder().encodeToString("username:[email protected]".getBytes()));
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"username",
password.toCharArray());
}
});
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8888");
System.out.println("Connecting to Google via authenticated proxy with password '"
+ password + "'");
try (InputStream conn = new URL("http://www.google.com/").openStream()) {
try (BufferedReader r = new BufferedReader(new InputStreamReader(conn))) {
System.out.println(r.readLine());
System.out.println("OK");
}
} catch (Exception e) {
System.out.println("Failed: " + e);
}
}
}
Первый ответ:
Код, который вы указали, берет пароль из свойства системы JVM. Как вы помещаете свой пароль в это свойство? Я подозреваю, что проблема там, а не в коде, который вы показали.
Если вы находитесь в Windows, и если вы задаете пароль в качестве аргумента командной строки, вам нужно будет использовать escape-код DOS char "^", т.е.
java -Dhttp.proxyPassword=foo^@bar -jar myapp.jar
Если вы используете другой механизм для предоставления пароля Java, вам может потребоваться другая схема экранирования.