10

Dank dieses Threads How to download and save a file from Internet using Java? Ich weiß, wie man eine Datei herunterladen, jetzt ist mein Problem, dass ich auf dem Server authentifizieren muss, von dem ich downloade. Es ist eine HTTP-Schnittstelle zu einem Subversion-Server. In welches Feld muss ich schauen?Laden Sie eine Datei aus dem Internet mit Java: Wie authentifizieren?

den Code im letzten Kommentar gepostet, bekomme ich diese Ausnahme:

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) 

Danke,

+0

Welche Ausnahme tun erhalten Sie, wenn Sie die Benutzer-ID und das Kennwort aus der URL weglassen? – cmsjr

+0

es ist die gleiche Ausnahme, wenn ich das Login/Pass weglassen oder wenn ich es (Code 401) – user105413

Antwort

11

Sie die Authenticator Klasse erweitern und es registrieren. Die Javadocs am Link erklären wie.

Ich weiß nicht, ob dies mit der nio-Methode funktioniert, die die akzeptierte Antwort auf die Frage bekommen hat, aber es funktioniert auf die altmodische Art und Weise, die die Antwort unter dieser war.

Innerhalb der Authenticator Klassenimplementierung, werden Sie wahrscheinlich eine PasswordAuthentication und überschreiben die getPasswordAuthentication() -Methode Ihrer Authenticator Implementierung es zurück zu verwenden. Dies ist die Klasse, der der Benutzername und das Passwort, die Sie benötigen, übergeben werden.

pro Ihre Anfrage, hier einige Beispielcode:

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; 
} 

Und Sie registrieren es in dem Hauptverfahren (oder irgendwo entlang der Strecke, bevor Sie die URL nennen):

Authenticator.setDefault(new MyAuthenticator(properties)); 

Die Die Verwendung ist einfach, aber ich finde die API verschachtelt und irgendwie rückwärts für wie Sie normalerweise über diese Dinge denken. Ziemlich typisch für Singleton Design.

+0

Könnten Sie einen Beispielcode posten? Das Javadoc gibt keine Beispiele, und es ist unmöglich zu wissen, wie man diese Klasse tatsächlich benutzt! – poundifdef

+3

Nun, man muss nur setDefault nennen und das ist es '\t \t Authenticator.setDefault (neu Authenticator() { \t \t \t geschützt PasswordAuthentication getPasswordAuthentication() { \t \t \t \t Rückkehr neue PasswordAuthentication ("Login"," pass“.toCharArray()); \t \t \t} \t \t});' ich – user105413

+0

Good stuff so beeindruckt bin! Eine typisch verdrehte Java-Lösung. Beachten Sie, dass es korrekter zu sagen ist, dass Sie die Authenticator-Klasse EXTENDIEREN statt IMPLEMENTIEREN müssen. Es ist keine Schnittstelle ... – jsh

1

Haben Sie versucht, Ihre URL in der http://user:[email protected]/path Form bauen?

+0

in meinem Browser, aber nicht in meinem Java-Programm – user105413

+0

tut Sorry, dass es nicht geklappt hat. Sieht so aus, als ob der von @ Yishai erwähnte Authenticator diese Technik umschließt http://www.javaworld.com/javaworld/javatips/jw-javatip47.html – cmsjr

7

Dies ist ein Code, den ich geschrieben habe, der eine Website abruft und den Inhalt auf System.out anzeigt. Es verwendet Standardauthentifizierung:

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(); 
} 

Probleme mit dem obigen Code:

  1. Dieser Code ist nicht produktionsbereit (., Aber es erhält den Punkt herüber)

  2. Die Code-Ausbeuten dieser Compiler-Warnung:

 
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 

Man sollte wirklich die Authenticator-Klasse benutzen, aber für mein Leben konnte ich nicht herausfinden, wie und ich konnte auch keine Beispiele finden, was zeigt, dass die Java-Leute es nicht wirklich mögen, wenn du es bist Verwenden Sie ihre Sprache, um coole Dinge zu tun. :-P

Also das obige ist keine gute Lösung, aber es funktioniert und könnte leicht später geändert werden.

+1

Wenn Sie einen Base64-Encoder wollen, empfehle ich die Implementierung von iharder.net. Public Domain, kann nicht freier werden. http://iharder.sourceforge.net/current/java/base64/ – Yishai

+0

Dies ist genau das, was ich brauchte, danke. – Amalgovinus

+0

Groovy haben bereits Base64-Unterstützung! Tun Sie einfach passwd.getBytes(). EncodeBase64(). ToString(). Siehe http://mrhaki.blogspot.com/2009/11/groovy-goodness-base64-encoding.html –

0

Diese Open-Source-Bibliothek, http://spnego.sourceforge.net, enthält auch einige Beispiele zur Verwendung der SpnegoHttpURLConnection-Klasse.

Einer der Konstruktoren in der Klasse ermöglicht die Eingabe eines Benutzernamens und eines Kennworts.

Werfen Sie einen Blick auf die Java-Dokumentation der Klasse für die Beispiele.

6

Ihre überragende Klasse für Authenticator schreiben:

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; 
    } 
} 

Ihre Hauptklasse schreiben:

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 
      } 
     } 

    } 

} 
Verwandte Themen