使用java从互联网下载文件:如何进行身份验证?

感谢这个线程 如何使用Java从互联网下载和保存文件?我知道如何下载文件,现在我的问题是我需要在我正在下载的服务器上进行身份验证。它是子版本服务器的 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)

谢谢


答案 1

扩展身份验证器类并注册它。链接中的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很复杂,对于你通常如何看待这些事情有点倒退。非常典型的单例设计。


答案 2

这是我写的一些代码,用于获取网站并将内容显示给 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

人们真的应该使用Authorcanator类,但是对于我的生活来说,我无法弄清楚如何,我也找不到任何例子,这只是表明Java人实际上并不喜欢它,当你使用他们的语言做很酷的事情时。9-3

因此,上述内容不是一个好的解决方案,但它确实有效,并且可以在以后轻松修改。