Java - Статус 401 - Проверка подлинности прокси PAC для JSoup - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь использовать Jsoup для сбора элементов с веб-страницы, однако я нахожусь за прокси-сервером PAC.Когда я пытаюсь получить доступ к веб-сайту с помощью Jsoup, я получаю код ошибки 401 Authentication.Кажется, проблема с прокси.Я установил библиотеку под названием Proxy-Vole, которая должна аутентифицировать меня, но я считаю, что не правильно ее использую.Что я хочу, так это в конечном итоге пройти аутентификацию на прокси-сервере и продолжить, как это возможно.

ProxySearch proxySearch = new ProxySearch();
if (PlatformUtil.getCurrentPlattform() == Platform.WIN) {
    proxySearch.addStrategy(Strategy.IE);
    proxySearch.addStrategy(Strategy.FIREFOX);
    proxySearch.addStrategy(Strategy.JAVA);
} else if (PlatformUtil.getCurrentPlattform() == Platform.LINUX) {
    proxySearch.addStrategy(Strategy.GNOME);
    proxySearch.addStrategy(Strategy.KDE);
    proxySearch.addStrategy(Strategy.FIREFOX);
} else {
    proxySearch.addStrategy(Strategy.OS_DEFAULT);
}

ProxySelector proxySelector = proxySearch.getProxySelector();
ProxySelector.setDefault(proxySelector);

Document doc = Jsoup.connect("https://www.whatever.com").get();

1 Ответ

1 голос
/ 28 мая 2019

Как объясняет руководство , вы должны выбрать правильный прокси для вашего запроса. Я обновил измененный пример кода для этого с помощью Java Streams:

URI uri = new URI("https://www.whatever.com");

Proxy proxy = Optional.ofNullable(ProxySelector.getDefault())
        .map(ps -> ps.select(uri))
        .stream().flatMap(List::stream)
        .max(Comparator.comparing(Proxy::type))
        .orElse(Proxy.NO_PROXY);

В этом примере используются прокси со следующим приоритетом: SOCKS, HTTP, DIRECT. Вы можете легко изменить это, обернув его в отдельный метод:

private static int getPriority(Proxy.Type type) {
    switch (type) {
        case HTTP:
            return 2;
        case SOCKS:
            return 1;
    }
    return 0;
}

Используйте это с Comparator.comparingInt(p -> getPriority(p.type())) в .max(). В качестве альтернативы вы можете использовать официальный пример кода, который я связал выше.

Теперь вы можете использовать это proxy в своем соединении Jsoup:

Document doc = Jsoup.connect(uri.toString())
        .proxy(proxy)
        .get();

Кроме того, вы должны убедиться, что ваше соединение работает через прокси. Если ваш прокси-сервер требует аутентификации, следуйте этой части данного руководства. Для устранения неполадок вы можете использовать Proxy Vole Tester .

...