Java Proxy Authentication

У меня есть Java webapp, запущенный в Tomcat 6, который загружает RSS-каналы с удаленных URL.

Я использую Rome для обработки 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.

6
задан Pierre Henry 29 December 2011 в 15:28
поделиться