17

このスレッドのおかげで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)

ありがとう、

4

6 に答える 6

16

Authenticatorクラスを拡張して登録します。リンクのjavadocsでその方法が説明されています。

これが質問に対する受け入れられた答えを得た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は複雑で、通常これらのことについてどのように考えるかについては逆になっています。シングルトンデザインのかなり典型的なものです。

于 2009-06-05T12:54:41.230 に答える
9

これは私が書いたコードで、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:警告:sun.misc.BASE64EncoderはSun独自のAPIであり、将来のリリースで削除される可能性があります
      sun.misc.BASE64Encoder()。encode(passwdstring.getBytes());
              ^1つの警告

Authenticatorクラスを実際に使用する必要がありますが、私の人生では、その方法を理解できず、例も見つかりませんでした。これは、Javaの人々が実際にAuthenticatorクラスを使用したときにそれを好まないことを示しています。クールなことをするための言語。:-P

したがって、上記は適切な解決策ではありませんが、機能し、後で簡単に変更できます。

于 2009-06-05T13:07:42.873 に答える
8

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

メインクラスを書きます:

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

    }

}
于 2014-08-06T14:43:54.813 に答える
1

Apache http://hc.apache.org/httpclient-3.x/から HttpClient をチェックアウトすることをお勧めします。これにより、ダウンロード/認証が非常に簡単になります

于 2009-06-05T12:50:26.667 に答える
1

http://user:password@domain/pathの形式で URL を構築しようとしましたか?

于 2009-06-05T12:47:15.067 に答える
0

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

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

例については、クラスのjavadocを参照してください。

于 2009-11-16T08:50:04.137 に答える