Вопрос по java, httpwebrequest, basic-authentication, authentication, download – Скачать файл из интернета, используя Java: Как пройти аутентификацию?

14

Благодаря этой темеКак скачать и сохранить файл из Интернета с помощью Java? Я знаю, как загрузить файл, теперь моя проблема в том, что мне нужно пройти аутентификацию на сервере, с которого я загружаю файлы. Это http-интерфейс к серверу Subversion. В какое поле мне нужно посмотреть?

Используя код, размещенный в последнем комментарии, я получаю это исключение:

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)

Спасибо,

То же самое исключение, если я пропускаю логин / пароль или если я его ставлю (код 401) user105413
Какое исключение вы получите, если пропустите идентификатор пользователя и пароль из URL? cmsjr

Ваш Ответ

6   ответов
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
            }
        }

    }

}
0

http://spnego.sourceforge.netТакже есть несколько примеров того, как использовать его класс SpnegoHttpURLConnection.

Один из конструкторов в классе позволяет передавать имя пользователя и пароль.

Посмотрите на java-документ класса для примеров.

1
это работает в моем браузере, но не в моей Java-программе user105413
Извините, это не сработало. Похоже, аутентификатор, упомянутый @Yishai, оборачивает эту техникуjavaworld.com/javaworld/javatips/jw-javatip47.html cmsjr
14

Authenticator Класс и зарегистрировать его. Javadocs по ссылке объясняют, как.

Я не знаю, работает ли это с методом nio, который получил принятый ответ на вопрос, но он наверняка работает по старомодному способу, который был ответом по этому вопросу.

В реализации класса authenticator вы, вероятно, собираетесь использоватьPasswordAuthentication и переопределите метод getPasswordAuthentication () вашей реализации Authenticator, чтобы вернуть его. Это будет класс, которому передаются имя пользователя и пароль, которые вам нужны.

По вашему запросу вот пример кода:

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 запутанным и отчасти задом наперед, как вы обычно думаете об этих вещах Довольно типично для синглтон-дизайна.

Не могли бы вы опубликовать пример кода? Javadoc не дает никаких примеров, и невозможно знать, как на самом деле использовать этот класс! poundifdef
Что ж, вам просто нужно вызвать setDefault и вот оно `Authenticator.setDefault (new Authenticator () {protected PasswordAuthentication getPasswordAuthentication () {вернуть новый PasswordAuthentication (" логин "," pass ".toCharArray ());}});` I я так впечатлен user105413
1

http://hc.apache.org/httpclient-3.x/ это делает загрузку / аутентификацию очень простой

7

который я написал, который выбирает веб-сайт и отображает содержимое в 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: 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 это не нравится, когда вы используете их. язык делать классные вещи. :-П

Таким образом, выше нехороший решение, но оно работает и может быть легко изменено позже.

В Groovy уже есть поддержка base64! Просто сделайте passwd.getBytes (). EncodeBase64 (). ToString (). Видетьmrhaki.blogspot.com/2009/11/... Wanderson Santos
Если вам нужен кодировщик base64, я рекомендую реализацию iharder.net. Public Domain, не может быть свободнее, чем это.iharder.sourceforge.net/current/java/base64 Yishai
Это как раз то, что мне было нужно, спасибо. Amalgovinus

Похожие вопросы