[Java] Verwenden Sie jsoup, um über einen Proxy, der eine Authentifizierung erfordert, auf HTTPS zuzugreifen

Überblick

Ich musste über einen Proxy mit jsoup darauf zugreifen, aber es war unerwartet schwierig.

Die Punkte sind die folgenden zwei Punkte.

Umgebung

jsoup

pom.xml


<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.12.1</version>
</dependency>

Java-Version: 8

OK Beispiel

//Brechen Sie die Einstellung "HTTPS-Zugriff über einen Proxy verbieten, für den eine Authentifizierung erforderlich ist" ab.
//Standardmäßig diese Eigenschaft"Basic"Wird angegeben und die Standardauthentifizierung kann nicht verwendet werden."Basic"Überschreiben Sie mit einem Leerzeichen, um die Einstellung von abzubrechen.
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");

//Proxy-Server-ID/Stellen Sie sicher, dass Sie das Passwort über Authenticator übergeben.
Authenticator.setDefault(new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("{Proxy-Server-Benutzer-ID}", "{Proxy-Server-Passwort}".toCharArray());
    }
});

Jsoup.connect("{URL, auf die Sie zugreifen möchten}")
  .proxy("{Proxyserver-ID oder Hostname}", {Portnummer des Proxyservers})
  .get();

NG Beispiel

//Version, die den Autorisierungsheader Teil 1 verwendet
Jsoup.connect("{URL, auf die Sie zugreifen möchten}")
  .header("Authorization", "Basic " + Base64.getEncoder().encodeToString("{Proxy-Server-Benutzer-ID}:{Proxy-Server-Passwort}".getBytes()))
  .proxy("{IP-Adresse oder Hostname des Proxyservers}", {Portnummer des Proxyservers})
  .get();
//Version, die den Autorisierungsheader Teil 2 verwendet (im Wert des Headers"Basic "Geben Sie nicht die Zeichenfolge von) an.
Jsoup.connect("{URL, auf die Sie zugreifen möchten}")
  .header("Authorization", Base64.getEncoder().encodeToString("{Proxy-Server-Benutzer-ID}:{Proxy-Server-Passwort}".getBytes()))
  .proxy("{IP-Adresse oder Hostname des Proxyservers}", {Portnummer des Proxyservers})
  .get();
// Proxy-Version, die den Autorisierungsheader Teil 1 verwendet
Jsoup.connect("{URL, auf die Sie zugreifen möchten}")
  .header("Proxy-Authorization", "Basic " + Base64.getEncoder().encodeToString("{Proxy-Server-Benutzer-ID}:{Proxy-Server-Passwort}".getBytes()))
  .proxy("{IP-Adresse oder Hostname des Proxyservers}", {Portnummer des Proxyservers})
  .get();
// Proxy-Version, die den Autorisierungsheader Teil 2 verwendet (im Wert des Headers"Basic "Geben Sie nicht die Zeichenfolge von) an.
Jsoup.connect("{URL, auf die Sie zugreifen möchten}")
  .header("Proxy-Authorization", Base64.getEncoder().encodeToString("{Proxy-Server-Benutzer-ID}:{Proxy-Server-Passwort}".getBytes()))
  .proxy("{IP-Adresse oder Hostname des Proxyservers}", {Portnummer des Proxyservers})
  .get();
// 「jdk.http.auth.tunneling."deaktivierte Schemata" ist nicht angegeben

Authenticator.setDefault(new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("{Proxy-Server-Benutzer-ID}", "{Proxy-Server-Passwort}".toCharArray());
    }
});

Jsoup.connect("{URL, auf die Sie zugreifen möchten}")
  .proxy("{Proxyserver-ID oder Hostname}", {Portnummer des Proxyservers})
  .get();

In beiden Fällen ist der folgende Fehler aufgetreten.

java.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.1 407 Proxy Authentication Required"

Referenz (danke)

Es war sehr hilfreich! Vielen Dank! https://qiita.com/kaakaa_hoe/items/d4fb11a3af035a287972

Recommended Posts

[Java] Verwenden Sie jsoup, um über einen Proxy, der eine Authentifizierung erfordert, auf HTTPS zuzugreifen
407 Fehler beim Versuch, über einen authentifizierten Proxy in Java auf die HTTPS-Site zuzugreifen
So richten Sie einen Proxy mit Authentifizierung in Feign ein
Java lernen: Verwenden Sie Timer, um so etwas wie einen Bomben-Timer zu erstellen
Eine Geschichte über Missverständnisse im Umgang mit Java-Scannern (Memo)
Verwendung von Java Optional
Verwendung der Java-Klasse
[Java] Verwendung von removeAll ()
Verwendung von Java Map
[Java] Gründe für die Verwendung von statischen
Verwendung von Java-Variablen
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
Ich möchte Swipeback auf einem Bildschirm verwenden, der XLPagerTabStrip verwendet
So implementieren Sie einen Job, der die Java-API in JobScheduler verwendet
Der Operator, der geboren wurde, um geboren zu werden, instanceof (Java) ~ So verwenden Sie den instanceof-Operator ~