java.net.PasswordAuthentication принимает имя пользователя и массив символов пароля. Передайте исходные символы пароля:

var credential = new java.net.PasswordAuthentication(
    "proxy-user", "p@ssword".toCharArray());

Значение — иллюстративный пароль. В коде приложения получайте настоящие символы из нужного источника учётных данных.

Символ @ внутри этого пароля — данные, потому что у пароля уже есть собственный аргумент. Преобразование в p%40ssword до конструктора передаёт другой пароль.

URL прокси имеет другое представление учётных данных. В URL вроде http://proxy-user:p%[email protected]:8080 кодированный @ относится к сведениям о пользователе, а следующий @ отделяет эти сведения от хоста. Декодируйте и кодируйте в соответствии с интерфейсом, который действительно потребляет значение.

Кавычки в shell, экранирование строковых литералов Java и процентное кодирование URL тоже решают разные задачи разбора. Определите, какой слой читает ввод, вместо того чтобы повторно кодировать учётные данные, пока не изменится поведение запроса.

Похожие статьи