10

このスレッドのおかげでHow to download and save a file from Internet using Java? 私はファイルをダウンロードする方法を知っています。今私の問題は、私がダウロードしているサーバ上で認証する必要があることです。これは、Subversionサーバーへのhttpインターフェイスです。どのフィールドを調べる必要がありますか?最後のコメントに投稿されたコードを使用してjavaを使用してインターネットからファイルをダウンロードする:認証方法?

は、私はこの例外を取得:

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) 

おかげで、

+0

を使用すると、URLからユーザーIDとパスワードを省略した場合、あなたはどのような例外を得るのですか? – cmsjr

+0

login/passを省略した場合、またはコード401を入れた場合の同じ例外です。 – user105413

答えて

11

を認証/ダウンロード可能apacheのhttp://hc.apache.org/httpclient-3.x/からのHttpClientをチェックアウトすることをお勧め。リンクのjavadocsには、その方法が説明されています。

質問に受け入れられた答えを得たnioメソッドでうまく動作するかどうかはわかりませんが、それは確かに古い方法でうまくいきました。

Authenticatorクラスの実装では、おそらくPasswordAuthenticationを使用し、Authenticator実装のgetPasswordAuthentication()メソッドをオーバーライドして返します。それは必要なユーザー名とパスワードが渡されるクラスになります。

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

そして、(あなたはURLを呼び出す前に、どこかのラインに沿っまたは)あなたはmainメソッドに登録:あなたの要求ごと

は、ここではいくつかのサンプルコードがある

Authenticator.setDefault(new MyAuthenticator(properties)); 

使い方は簡単ですが、私はAPIを複雑にしていて、これらのことについて一般的にどのように考えているのかについては裏付けがあります。かなり典型的なシングルトンデザイン。

+0

サンプルコードを投稿できますか? javadocには例はありません。実際にこのクラスを使用する方法を知ることは不可能です。 – poundifdef

+3

さて、あなただけは、SetDefaultを呼び出す必要がありますし、それを '\t \t Authenticator.setDefaultのthats(新しい認証(){ \t \t \t保護されたPasswordAuthentication getPasswordAuthentication(){ \t \t \t \tリターン新しいPasswordAuthenticationを( "ログイン"、「合格」.toCharArray()); \t \t \t} \t \t});私は – user105413

+0

良いものとても感心 ' !典型的にはねじれたJavaソリューションです。 Authenticatorクラスを実装するのではなく、EXTENDする必要があると言うのが正しいかもしれません。それはインターフェイスではありません... – jsh

1

はフォームhttp://user:[email protected]/pathであなたのURLを構築しようとしたことがありますか?

+0

私のブラウザでは動作しますが、Javaプログラムでは動作しません – user105413

+0

申し訳ありませんが、うまくいきませんでした。 @Yishaiが述べたオーセンティケータがそのテクニックを包み込むように見える http://www.javaworld.com/javaworld/javatips/jw-javatip47.html – cmsjr

1

私はそれはあなたがAuthenticatorクラスを拡張し、それを登録し、非常に簡単

7

これは私がWebサイトを取得し、内容をSystem.outに表示するために書いたコードです。これは、基本認証を使用しています。上記のコードで

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

問題:(。しかし、それは全体のポイントを取得します)

  1. このコードは生産準備ができていない

  2. コード利回りこのコンパイラの警告:

 
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 

本当にAuthenticatorクラスを使用するべきですが、私の人生の中でどのようにして、どのような例も見つけられず、Javaの人々が実際に好きではないことを示しています彼らの言語を使ってクールなことをする。 :-P

したがって、上記はという優れた解決策ではありませんが、それはうまく機能しますが、後で簡単に変更できます。

+1

Base64エンコーダが必要な場合は、iharder.netの実装をお勧めします。パブリックドメインは、それより自由になることはできません。 http://iharder.sourceforge.net/current/java/base64/ – Yishai

+0

これはちょうど私が必要としたものです、ありがとうございます。 – Amalgovinus

+0

Groovyはすでにbase64をサポートしています! passwd.getBytes()。encodeBase64()。toString()を実行します。 http://mrhaki.blogspot.com/2009/11/groovy-goodness-base64-encoding.htmlを参照してください。 –

0

このオープンソースライブラリhttp://spnego.sourceforge.netには、SpnegoHttpURLConnectionクラスの使用方法の例がいくつかあります。

クラスのコンストラクタの1つで、ユーザー名とパスワードを渡すことができます。

例については、クラスのjavaドキュメントを参照してください。

6

認証のためのあなたの最優先クラスを書く:

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

あなたのメインクラスを書く:

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

    } 

} 
関連する問題