10

Merci à ce fil How to download and save a file from Internet using Java? je sais comment télécharger un fichier, maintenant mon problème est que je dois authentifier sur le sever dont je suis dowloading. C'est une interface http pour un serveur subversion. Dans quel domaine dois-je rechercher?Télécharger un fichier depuis Internet en utilisant java: Comment authentifier?

En utilisant le code affiché dans le dernier commentaire, je reçois cette exception:

java.io.IOException: Server returned HTTP response code: 401 for URL: http://myserver/systemc-2.0.1.tgz 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1305) 
    at java.net.URL.openStream(URL.java:1009) 
    at mypackage.Installer.installSystemc201(Installer.java:29) 
    at mypackage.Installer.main(Installer.java:38) 

Merci,

+0

Quelle exception obtenez-vous si vous ne spécifiez pas l'ID utilisateur et mot de passe de l'URL? – cmsjr

+0

c'est la même exception si je omets le login/passe ou si je le mets (code 401) – user105413

Répondre

11

Vous étendez la classe Authenticator et l'enregistrer. Les javadocs sur le lien expliquent comment.

Je ne sais pas si cela fonctionne avec la méthode nio qui a obtenu la réponse acceptée à la question, mais pour des œuvres sûres pour l'ancienne qui était la réponse dans celui-là.

Dans l'implémentation de la classe Authenticator, vous allez probablement utiliser un PasswordAuthentication et remplacer la méthode getPasswordAuthentication() de votre implémentation Authenticator pour la renvoyer. Ce sera la classe qui est transmis le nom d'utilisateur et mot de passe dont vous avez besoin.

votre demande, voici quelques exemples de code:

public static final String USERNAME_KEY = "username"; 
public static final String PASSWORD_KEY = "password"; 
private final PasswordAuthentication authentication; 

public MyAuthenticator(Properties properties) { 
    String userName = properties.getProperty(USERNAME_KEY); 
    String password = properties.getProperty(PASSWORD_KEY); 
    if (userName == null || password == null) { 
     authentication = null; 
    } else { 
     authentication = new PasswordAuthentication(userName, password.toCharArray()); 
    } 
} 

protected PasswordAuthentication getPasswordAuthentication() { 
    return authentication; 
} 

Et vous enregistrer dans la principale méthode (ou quelque part le long de la ligne avant d'appeler l'URL):

Authenticator.setDefault(new MyAuthenticator(properties)); 

Le l'utilisation est simple, mais je trouve l'API alambiqué et le type de l'envers la façon dont vous pensez habituellement à ces choses. Assez typique du design singleton.

+0

Pourriez-vous poster un exemple de code? Le javadoc ne donne aucun exemple, et il est impossible de savoir comment utiliser réellement cette classe! – poundifdef

+3

Eh bien, vous avez juste à appeler setDefault et thats it '\t \t Authenticator.setDefault (nouvelle Authenticator() { \t \t \t protégé PasswordAuthentication getPasswordAuthentication() { \t \t \t \t return new PasswordAuthentication ("login"," passer » .toCharArray()); \t \t \t} \t \t});' Je suis tellement impressionné – user105413

+0

bonnes choses! Une solution java typiquement torsadée. Notez qu'il peut être plus correct de dire que vous devez EXTENDER plutôt qu'implémenter la classe Authenticator; ce n'est pas une interface ... – jsh

1

Avez-vous essayé de construire votre URL sous la forme http://user:[email protected]/path?

+0

cela fonctionne dans mon navigateur, mais pas dans mon programme Java – user105413

+0

Désolé, cela n'a pas fonctionné. On dirait que l'authentificateur mentionné par @Yishai enveloppe cette technique http://www.javaworld.com/javaworld/javatips/jw-javatip47.html – cmsjr

7

C'est un code que j'ai écrit un site Web qui récupère et affiche le contenu à System.out. Il utilise l'authentification de base:

import java.net.*; 
import java.io.*; 

public class foo { 
    public static void main(String[] args) throws Exception { 

    URL yahoo = new URL("http://www.MY_URL.com"); 

    String passwdstring = "USERNAME:PASSWORD"; 
    String encoding = new 
      sun.misc.BASE64Encoder().encode(passwdstring.getBytes()); 

    URLConnection uc = yahoo.openConnection(); 
    uc.setRequestProperty("Authorization", "Basic " + encoding); 

    InputStream content = (InputStream)uc.getInputStream(); 
    BufferedReader in = 
      new BufferedReader (new InputStreamReader (content)); 

    String line; 
    while ((line = in.readLine()) != null) { 
     System.out.println (line); 
    } 

    in.close(); 
} 

Problèmes avec le code ci-dessus:

  1. Ce code n'est pas prêts à la production (. Mais il obtient le point à travers)

  2. Les rendements de code cet avertissement du compilateur:

 
foo.java:11: warning: sun.misc.BASE64Encoder is Sun proprietary API and may be removed in a future release 
     sun.misc.BASE64Encoder().encode(passwdstring.getBytes()); 
      ^1 warning 

On devrait vraiment utiliser la classe Authenticator, mais pour la vie de moi, je ne pouvais pas comprendre comment et je ne pouvais pas trouver d'exemples non plus, ce qui montre que les gens de Java ne l'aiment pas vraiment quand vous utiliser leur langue pour faire des choses cool. :-P

Donc, ce qui précède n'est pas une bonne solution, mais cela fonctionne et pourrait facilement être modifié plus tard.

+1

Si vous voulez un encodeur base64, je recommande l'implémentation de iharder.net. Domaine public, ne peut pas être plus libre que cela. http://iharder.sourceforge.net/current/java/base64/ – Yishai

+0

C'est exactement ce dont j'avais besoin, merci. – Amalgovinus

+0

Groovy a déjà le support de base64! Faites simplement passwd.getBytes(). EncodeBase64(). ToString(). Voir http://mrhaki.blogspot.com/2009/11/groovy-goodness-base64-encoding.html –

0

Cette bibliothèque open source, http://spnego.sourceforge.net, contient également des exemples d'utilisation de sa classe SpnegoHttpURLConnection.

L'un des constructeurs de la classe vous permet de transmettre un nom d'utilisateur et un mot de passe. Jetez un oeil à la documentation java de la classe pour les exemples.

6

Écrivez votre classe dominante pour Authenticator:

import java.net.Authenticator; 
import java.net.PasswordAuthentication; 

public class MyAuthenticator extends Authenticator { 
    private static String username = ""; 
    private static String password = ""; 

    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication (MyAuthenticator.username, 
       MyAuthenticator.password.toCharArray()); 
    } 

    public static void setPasswordAuthentication(String username, String password) { 
     MyAuthenticator.username = username; 
     MyAuthenticator.password = password; 
    } 
} 

Écrivez votre classe principale:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.Authenticator; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class MyMain{ 


    public static void main(String[] args) { 
     URL url; 
     InputStream is = null; 
     BufferedReader br; 
     String line; 

     // Install Authenticator 
     MyAuthenticator.setPasswordAuthentication("Username", "Password"); 
     Authenticator.setDefault (new MyAuthenticator()); 

     try { 
      url = new URL("Your_URL_Here"); 
      is = url.openStream(); // throws an IOException 
      br = new BufferedReader(new InputStreamReader(is)); 
      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
      } 
     } catch (MalformedURLException mue) { 
      mue.printStackTrace(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } finally { 
      try { 
       if (is != null) is.close(); 
      } catch (IOException ioe) { 
       // nothing to see here 
      } 
     } 

    } 

} 
Questions connexes