java. нужно ее средставами скачать с сайта zip-архив

Alex1010

как это сделать, если на сайте необходима авторизация и используется SSL.
(логин и пароль имеются)
Подскажите, плиз

Svyatogor

Посмотрите java.net.URL по части метода openConnection он Вам вернет javax.net.ssl.HttpsURLConnection для URL вида http://....
Далее, смотрите методы у java.net.HttpURLConnection (HttpsURLConnection её наследник а именно: addRequestProperty, setDoInput, setDoOutput, getInputStream, getOutputStream, setRequestMethod.
Ну а также вам придется разобраться с протоколом HTTP и тем, как реализуется аутентификация (HTTP-auth, from-based) на том сервере, с которого производится скачивание. Еще может быть придется что-нибудь с cookie реализовывать (информация по cookies вроде в гугле была для Джавы).

Alex1010

спасибо за развернутый ответ.
мне еще посоветовали использовать HttpClient для этих целей.
Я так понимаю что это альтернатива для вашего решения с java.net.URL?

anton7805

public static boolean sendMsgSSL(String URLName, String msg) {
boolean bret = false;
try {
URL url = new URL(URLName);
javax.net.ssl.HttpsURLConnection conssl = null;
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null,null,null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory;
conssl = (HttpsURLConnection)url.openConnection;
conssl.setHostnameVerifier(new HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
);
conssl.setDoOutput(true);
conssl.setAllowUserInteraction(true);
conssl.setRequestProperty("Content-Type", XML_CONTENT_TYPE);
conssl.setUseCaches (false);
conssl.setRequestMethod("POST");
String encoded = new String(Base64.encode(new String("yourlogin:pass").getBytes;
conssl.setRequestProperty("Proxy-Authorization", "CONFIDENTIAL " + encoded);
OutputStream os = conssl.getOutputStream;
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bosw = new BufferedWriter(osw);
bosw.write(msg);
bosw.close;
//Certificate[] crf = conssl.getLocalCertificates;
//Certificate[] srf = conssl.getServerCertificates;
bret = (conssl.getResponseCode==HttpsURLConnection.HTTP_OK);
conssl.disconnect;
}
catch (Exception e) {
System.out.println( e.toString );
}
return bret;
}

это посылка сообщения по ssl с авторизацией, тебе надо чуть изменить, а именно :
- открыть входной поток для записи файла
- поменять тип авторизации , если нужно
- поменять Content-Type в параметрах запроса
и пробовать, пробовать....

Alex1010

спасибо большое, буду пробовать

Svyatogor

HttpClient скорее всего действительно альтернатива, а на самом деле с его помощью может и проще получится, я с ним не работал. Учтите, что HttpClient - это внешняя библиотека, java.net.URL же входит в java language specification. Вообще, смотрите код 'а, у него код правильный (видимо, у него под рукой оказался, у меня под рукой не было такого, только на работе). В качестве основы для дальнейшей программы - пойдет. Единственное, что можно было сделать проще одну строчку:

String encoded = new String(Base64.encode(new String("yourlogin:pass").getBytes;

Можно немного проще

String encoded = new String(Base64.encode("yourlogin:pass".getBytes;

Кстати

catch (Exception e) {
System.out.println( e.toString );
}

Лучще писать как

catch (Exception e) {
e.printStackTrace;
}

Он выведет стек вызовов, и будет видно, где произошла ошибка. e.toString такой информации не даст.
А так - разбирайтесь. Удачи

Alex1010

не подскажите, как решить такую проблему
javax.net.ssl.SSLException: SSL V2.0 servers are not supported.
Когда я пытаюсь зайти на какой либо другой адрес, то такого не возникает

kokoc88

This is correct — see the information at http://java.sun.com/products/jsse. Only SSL v3 is supported. You'll either need to upgrade the server or stick with MRJ 2.2.5, which goes through IE. That may or may not be better.

Alex1010

это прочитал, вот теперь интересно, неужели нет никакого выхода?

psihodog

прочитай ещё раз.

Svyatogor

Выход может и есть. Попробуйте вместо

SSLContext ctx = SSLContext.getInstance("TLS");

Варианты

SSLContext ctx = SSLContext.getInstance("SSLv3");

Ну и заменяя SSLv3 на различные варианты: т.е. на SSLv2 или просто SSL.
Также попробуйте без кода инициализации - т.е. без строчек

SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null,null,null);
HttpsURLConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory;
conssl.setHostnameVerifier(new HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
);

(внимательнее, я там connssl.getConnection убрал).
У меня https соединение работало вообще без этого кода.
Предлагалось здесь: http://www.intellij.net/forums/thread.jspa?messageID=4997598
Кстати, по времени это позже, чем
This is correct — see the information at http://java.sun.com/products/jsse. Only SSL v3 is supported. You'll either need to upgrade the server or stick with MRJ 2.2.5, which goes through IE. That may or may not be better.
(по адресу http://lists.apple.com/archives/java-dev/2002/Jan/msg00077.h...
Оставить комментарий
Имя или ник:
Комментарий: