У меня есть веб-приложение на Java, работающее на Tomcat 6, которое загружает RSS-каналы с удаленных URL-адресов.
Я использую Рим для обработки RSS-каналов и различных форматов для меня. Часть подключения выглядит так:
try{
feedSource = new URL(rssObject.getAsset());
}catch(MalformedURLException mue){
logger.error(...);
throw mue;
}
try{
URLConnection connection = feedSource.openConnection();
feed = new SyndFeedInput().build(new XmlReader(connection));
}catch(Exception){handle...}
Код работает нормально, за исключением этого нового клиента, где они используют прокси.
Чтобы использовать прокси, я установил свойства системы http.proxyHost и proxyPort:
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", proxyPort);
System.setProperty("https.proxyHost", proxyHost);
System.setProperty("https.proxyPort", proxyPort);
HTTP GET сделан для прокси в порядке, но теперь я получаю ошибку HTTP 502 (плохой шлюз или что-то подобное).
Анализируя обмен HTTP с Wireshark, я заметил, что прокси требует аутентификации. Он отправляет HTTP 507. Java каким-то образом пытается аутентифицироваться, но использует неправильные имя пользователя и пароли. Кажется, что в качестве имени пользователя используется имя хоста, что касается пароля, который я не знаю.
Поэтому я попытался реализовать метод Authenticator, указав имя пользователя и пароль:
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
logger.info(MessageFormat.format("Generating PasswordAuthentitcation for proxy authentication, using username={0} and password={1}.", username, password));
return new PasswordAuthentication(username, password.toCharArray());
}
});
Теперь моя проблема в том, что это игнорируется. Метод getPasswordAuthentication никогда не вызывается. Я не вижу оператора регистрации в файле журнала и, используя Wireshark, я вижу, что он все еще использует имя хоста в качестве имени пользователя.
Почему? Кажется, что Java каким-то образом пытается аутентифицироваться без консультации с Аутентификатором.
Прокси выглядит как устройство MS, которое использует NTLM для аутентификации. Есть ли какой-то встроенный механизм в Java для этого? Компьютер, на котором работает приложение, - это Win Server 2008 R2.