Comment puis-je me connecter à une URL distante en Java qui nécessite une authentification. J'essaie de trouver un moyen de modifier le code suivant pour pouvoir fournir par programme un nom d'utilisateur / mot de passe afin qu'il ne lance pas un 401.
URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
java
httpurlconnection
user14128
la source
la source
Réponses:
Vous pouvez définir l'authentificateur par défaut pour les requêtes http comme ceci:
De plus, si vous avez besoin de plus de flexibilité, vous pouvez consulter Apache HttpClient , qui vous donnera plus d'options d'authentification (ainsi que la prise en charge de session, etc.)
la source
Authenticator
parURL.openConnection()
appel spécifique plutôt que de le définir globalement?HttpURLConnection.setAuthenticator()
. Malheureusement sur Java 8 et les versions antérieures, l'instance Authenticator est une variable globale à l'échelle de la JVM. Voir: docs.oracle.com/javase/9/docs/api/java/net/…Il existe une alternative native et moins intrusive, qui ne fonctionne que pour votre appel.
la source
.trim()
le résultat ou appelez une variante de méthode qui ne produit pas de sortie fragmentée.javax.xml.bind.DatatypeConverter
semble plus sûr.Vous pouvez également utiliser les éléments suivants, qui ne nécessitent pas l'utilisation de packages externes:
la source
--add-modules javax.xml.bind
car ils ont supprimé le package du chemin de classe par défaut. Et dans Java11 +, il est complètement supprimé, vous avez à nouveau besoin d'une dépendance externe. Tel est le progrès!java.util.Base64
moment, donc c'est un progrès :)Si vous utilisez la connexion normale lors de la saisie du nom d'utilisateur et du mot de passe entre le protocole et le domaine, c'est plus simple. Cela fonctionne également avec et sans connexion.
Exemple d'URL: http: // utilisateur: [email protected]/url
Veuillez noter dans le commentaire, de valerybodak, ci-dessous comment cela se fait dans un environnement de développement Android.
la source
url.getUserInfo()
passeriez d'URLDecoder.decode()
abord par (@Peter Rader).Comme je suis venu ici à la recherche d'une réponse Android-Java-Answer, je vais faire un bref résumé:
Si vous souhaitez utiliser java.net.URLConnection avec l'authentification de base sous Android, essayez ce code:
la source
Était capable de définir l'authentification à l'aide de la HttpsURLConnection
quelques-uns des changements extraits de ce post. et Base64 provient du package java.util.
la source
Soyez vraiment prudent avec l'approche "Base64 (). Encode ()", mon équipe et moi avons eu 400 problèmes de requête Apache car elle ajoute un \ r \ n à la fin de la chaîne générée.
Nous l'avons trouvé reniflant des paquets grâce à Wireshark.
Voici notre solution:
J'espère que ça aide!
la source
Utilisez ce code pour l'authentification de base.
la source
Je voudrais fournir une réponse pour le cas où vous n'avez pas de contrôle sur le code qui ouvre la connexion. Comme je l'ai fait lors de l'utilisation de
URLClassLoader
pour charger un fichier jar à partir d'un serveur protégé par mot de passe.La
Authenticator
solution fonctionnerait mais présente l'inconvénient qu'elle essaie d'abord d'atteindre le serveur sans mot de passe et seulement après que le serveur demande un mot de passe en fournit un. C'est un aller-retour inutile si vous savez déjà que le serveur aurait besoin d'un mot de passe.Cela enregistre un nouveau protocole
my
qui est remplacé parhttp
lorsque les informations d'identification sont ajoutées. Donc, lors de la création du nouveau,URLClassLoader
remplacez-lehttp
parmy
et tout va bien. Je sais queURLClassLoader
fournit un constructeur qui prend unURLStreamHandlerFactory
mais cette usine n'est pas utilisée si l'URL pointe vers un fichier jar.la source
Depuis Java 9, vous pouvez le faire
la source
setAuthenticator()
méthode.MISE EN ŒUVRE D'ANDROD Une méthode complète pour demander une réponse de données / chaîne au service Web demandant une autorisation avec un nom d'utilisateur et un mot de passe
la source
je l'ai fait de cette façon, vous devez le faire, il suffit de copier-coller, soyez heureux
la source