Java-状态401-JSoup的PAC代理身份验证

时间:2019-05-28 17:04:42

标签: java proxy jsoup pac

我正在尝试使用Jsoup从网页中收集元素,但是我在PAC代理后面。当我尝试使用Jsoup访问网站时,出现代码状态401身份验证错误。似乎问题与代理有关。我安装了一个名为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 个答案:

答案 0 :(得分:1)

guide所述,您应该为您的请求选择正确的代理。我使用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);

此示例按以下优先级使用代理:SOCKSHTTPDIRECT。您可以通过将其包装在单独的方法中轻松地对其进行更改:

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()一起使用。另外,您也可以使用我上面链接的官方示例代码。

您现在可以在Jsoup连接中使用该proxy

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

此外,您应确保连接通过代理正常工作。如果您的代理服务器要求身份验证,请遵循指南的this part。要进行故障排除,您可以使用Proxy Vole Tester