このスレッドのおかげで Javaを使用してインターネットからファイルをダウンロードして保存する方法は? ファイルをダウンロードする方法を知っています。今の私の問題は、ダウンロード元のサーバーで認証する必要があることです。これは、Subversionサーバーへのhttpインターフェースです。どのフィールドを調べる必要がありますか?
最後のコメントに投稿されたコードを使用すると、次の例外が発生します。
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)
ありがとう、
Authenticator クラスを拡張して登録します。リンクのjavadocでその方法が説明されています。
これが質問に対する受け入れられた答えを得たnioメソッドで機能するかどうかはわかりませんが、それは確かにその下の答えであった昔ながらの方法で機能します。
オーセンティケータークラスの実装内では、おそらく PasswordAuthentication を使用し、オーセンティケーター実装の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;
}
そして、それをmainメソッドに(またはURLを呼び出す前のどこかに)登録します。
Authenticator.setDefault(new MyAuthenticator(properties));
使い方は簡単ですが、APIは複雑で、通常これらのことについてどのように考えるかについては逆になっています。シングルトンデザインのかなり典型的です。
これは私が書いたコードで、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();
}
上記のコードの問題:
このコードは本番環境に対応していません(ただし、要点はわかります)。
コードはこのコンパイラ警告を生成します:
foo.Java:11:警告:Sun.misc.BASE64EncoderはSun独自のAPIであり、将来のリリースで削除される可能性があります Sun.misc.BASE64Encoder()。encode(passwdstring.getBytes() ); ^ 1つの警告
Authenticatorクラスを実際に使用する必要がありますが、私の人生では、その方法を理解できず、例も見つかりませんでした。これは、Javaの人々があなたが彼らの言語を使ってクールなことをするとき、実際にはそれが好きではありません。:-P
したがって、上記はgoodの解決策ではありませんが、機能し、後で簡単に変更できます。
オーセンティケーターのオーバーライドクラスを作成します。
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
}
}
}
}
ApacheからHttpClientをチェックアウトすることをお勧めします http://hc.Apache.org/httpclient-3.x/ ダウンロード/認証が非常に簡単になります
http:// user:password @ domain/path の形式でURLを作成してみましたか?
このオープンソースライブラリ http://spnego.sourceforge.net には、SpnegoHttpURLConnectionクラスの使用方法に関する例もいくつかあります。
クラスのコンストラクターの1つを使用すると、ユーザー名とパスワードを渡すことができます。
例については、クラスのJavaドキュメントを参照してください。