открытие http-соединения за прокси, которое требует аутентификации, но не возвращает 407 - PullRequest
2 голосов
/ 26 июля 2011

Наш апплет находится за Microsoft ISA Server, который имеет встроенную прокси-аутентификацию. Иса-прокси-сервер возвращает http 405 ( НЕ 407 ) для соединений, у которых нет учетных данных аутентификации.не звонить. как я могу аутентифицировать мои подключения к прокси-серверу в этой ситуации?

Апплет подписан и скомпилирован с java1.6.URLConnection класс используется для соединений.

1 Ответ

2 голосов
/ 26 июля 2011

Я вижу два подхода к решению этой проблемы, и ни один из них не является идеальным.Во-первых, я предполагаю, что вы убедились, что отправка запроса с информацией об авторизации не приводит к 405 коду ответа?Если ответ «да», вы можете попробовать установить заголовок Proxy-authorization в запросе в качестве заголовка:

URL url = new URL("http://location");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Proxy-authorization", authorizationValue);

Формат этого заголовка будет зависеть от схемы авторизации, требуемой прокси-сервером,так что вам придется провести некоторые исследования для вашего конкретного сценария.

Второй подход заключается в создании подкласса внутреннего класса JDK для подмены кода ответа для принудительного использования обычного пути аутентификации прокси.Во-первых, вот подкласс:

public class HttpURLConnection extends sun.net.www.protocol.http.HttpURLConnection {

    @Override
    public int getResponseCode() throws IOException {
        int code = super.getResponseCode();
        if (code == HTTP_BAD_METHOD) {
            code = HTTP_PROXY_AUTH;
            responseCode = code;
        }
        return code;
    }

}

Конечно, это замаскирует любые фактические ответы 405, чтобы иметь непредвиденные последствия.Указание объекту URL для использования этого требует подкласса java.net.URLStreamHandlerFactory:

public class URLStreamHandlerFactory extends java.net.URLStreamHandlerFactory {
    @Override
    URLStreamHandler createURLStreamHandler(String protocol) {
        if (!protocol.equals("http")) {
            return null;
        } else {
            return new java.net.URLStreamHandler {
                protected String proxy;
                protected int proxyPort;

                public Handler () {
                    proxy = null;
                    proxyPort = -1;
                }

                public Handler (String proxy, int port) {
                    this.proxy = proxy;
                    this.proxyPort = port;
                }

                @Override
                protected java.net.URLConnection openConnection(URL u) throws IOException {
                        return openConnection(u, (Proxy)null);
                }

                @Override
                protected java.net.URLConnection openConnection(URL u, Proxy p) throws IOException {
                        return new HttpURLConnection(u, p, this);
                }

                @Override
                protected int getDefaultPort() {
                    return 80;
                }

            }
        }
    }
}

Затем вы можете использовать этот объект, вызвав URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory()); где-нибудь в коде инициализации.Я нашел этот сайт и этот сайт полезными для изучения работы основных классов Java.Если вам требуется поддержка HTTPS, вам потребуется внести аналогичные изменения для этого протокола.

Надеемся, что одно из этих решений может быть полезным для вас.Я не совсем уверен, что последний подход будет работать в рамках ограничений безопасности апплета.Первый должен хотя.Также возможно, что это будет проще сделать с другой библиотекой HTTP, такой как Apache HttpComponents , если вы можете использовать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...