Wie verbinde ich mich mit einer Remote-URL in Java, für die eine Authentifizierung erforderlich ist? Ich versuche einen Weg zu finden, den folgenden Code zu ändern, um programmgesteuert einen Benutzernamen / ein Passwort eingeben zu können, damit kein 401 ausgelöst wird.
URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
java
httpurlconnection
user14128
quelle
quelle
Antworten:
Sie können den Standardauthentifizierer für http-Anforderungen wie folgt festlegen:
Wenn Sie mehr Flexibilität benötigen, können Sie sich auch den Apache HttpClient ansehen , der Ihnen mehr Authentifizierungsoptionen (sowie Sitzungsunterstützung usw.) bietet.
quelle
Authenticator
pro bestimmtenURL.openConnection()
Aufruf festzulegen, anstatt sie global festzulegen?HttpURLConnection.setAuthenticator()
. Leider ist die Authenticator-Instanz unter Java 8 und früheren Versionen eine JVM-weite globale Variable. Siehe: docs.oracle.com/javase/9/docs/api/java/net/…Es gibt eine native und weniger aufdringliche Alternative, die nur für Ihren Anruf funktioniert.
quelle
.trim()
das Ergebnis erhalten oder eine Methodenvariante aufrufen, die keine Blockausgabe erzeugt.javax.xml.bind.DatatypeConverter
scheint sicherer.Sie können auch Folgendes verwenden, für das keine externen Pakete erforderlich sind:
quelle
--add-modules javax.xml.bind
da das Paket aus dem Standardklassenpfad entfernt wurde. Und in Java11 + ist es vollständig entfernt, Sie benötigen wieder eine externe Abhängigkeit. Das ist Fortschritt!java.util.Base64
jetzt, so ist es in der Tat Fortschritt :)Wenn Sie die normale Anmeldung verwenden, während Sie den Benutzernamen und das Kennwort zwischen dem Protokoll und der Domäne eingeben, ist dies einfacher. Es funktioniert auch mit und ohne Login.
Beispiel-URL: http: // user: [email protected]/url
Bitte beachten Sie im Kommentar von valerybodak unten, wie es in einer Android-Entwicklungsumgebung gemacht wird.
quelle
url.getUserInfo()
obigen CodeausschnittURLDecoder.decode()
zuerst durchgehen (@Peter Rader).Da ich hierher gekommen bin, um eine Android-Java-Antwort zu suchen, werde ich eine kurze Zusammenfassung machen:
Wenn Sie java.net.URLConnection mit Standardauthentifizierung in Android verwenden möchten, versuchen Sie diesen Code:
quelle
Konnte die Authentifizierung über die HttpsURLConnection einstellen
Einige der Änderungen wurden aus diesem Beitrag abgerufen. und Base64 stammt aus dem Paket java.util.
quelle
Seien Sie sehr vorsichtig mit dem Ansatz "Base64 (). Encode ()". Mein Team und ich haben 400 Probleme mit fehlerhaften Apache-Anforderungen, da am Ende der generierten Zeichenfolge ein \ r \ n hinzugefügt wird.
Wir fanden es dank Wireshark, Pakete zu schnüffeln.
Hier ist unsere Lösung:
Ich hoffe es hilft!
quelle
Verwenden Sie diesen Code für die Basisauthentifizierung.
quelle
Ich möchte eine Antwort für den Fall geben, dass Sie keine Kontrolle über den Code haben, der die Verbindung öffnet. Wie ich es getan habe, als ich
URLClassLoader
eine JAR-Datei von einem passwortgeschützten Server geladen habe.Die
Authenticator
Lösung würde funktionieren, hat jedoch den Nachteil, dass zuerst versucht wird, den Server ohne Kennwort zu erreichen, und erst, nachdem der Server nach einem Kennwort gefragt hat, eines bereitgestellt wird. Dies ist eine unnötige Rundreise, wenn Sie bereits wissen, dass der Server ein Kennwort benötigt.Dadurch wird ein neues Protokoll registriert,
my
dashttp
beim Hinzufügen von Anmeldeinformationen ersetzt wird. So bei der Erstellung der neuenURLClassLoader
ersetzen Sie einfachhttp
mitmy
und alles ist in Ordnung. Ich weiß,URLClassLoader
dass ein Konstruktor bereitgestellt wird, der eine verwendet,URLStreamHandlerFactory
aber diese Factory wird nicht verwendet, wenn die URL auf eine JAR-Datei verweist.quelle
Seit Java 9 können Sie dies tun
quelle
setAuthenticator()
Methode nicht gesehen .ANDROD-UMSETZUNG Eine vollständige Methode zum Anfordern einer Daten- / Zeichenfolgenantwort vom Webdienst, der eine Autorisierung mit Benutzername und Kennwort anfordert
quelle
Ich habe das so gemacht, dass du es tun musst, einfach kopieren, einfügen, glücklich sein
quelle