Javaのhttps Webページからファイルをログインしてダウンロードするにはどうすればよいですか?
質問
https Webページにログインし、Javaを使用してファイルをダウンロードする必要があります。 事前にすべてのURLを知っています:
baseURL = // a https URL;
urlMap = new HashMap<String, URL>();
urlMap.put("login", new URL(baseURL, "exec.asp?login=username&pass=XPTO"));
urlMap.put("logout", new URL(baseURL, "exec.asp?exec.asp?page=999"));
urlMap.put("file", new URL(baseURL, "exec.asp?file=111"));
これらのリンクをすべて、FirefoxなどのWebブラウザーで試した場合、機能します。
今やるとき:
urlConnection = urlMap.get("login").openConnection();
urlConnection.connect();
BufferedReader in = new BufferedReader(
new InputStreamReader(urlConnection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
ログインページのHTMLを再度取得しただけで、ファイルのダウンロードに進むことができません。
ありがとう!
解決
Alnitakには、問題がCookieを保存して返す可能性が高いことに同意します。
私が使用したもう1つの優れたオプションは、ジャカルタコモンズの HttpClient です。
さておき、これがあなたが制御するサーバーである場合、ユーザー名とパスワードをクエリ文字列として送信することは安全ではないことに注意する必要があります(HTTPSを使用している場合でも)。 HttpClientはPOSTを使用したパラメーターの送信をサポートしています。これは考慮する必要があります。
他のヒント
前述のように、リクエスト間でセッションCookieを維持する必要があります( CookieHandler )。
サンプルの実装は次のとおりです。
class MyCookieHandler extends CookieHandler {
private Map<String, List<String>> cookies = new HashMap<String, List<String>>();
@Override
public Map<String, List<String>> get(URI uri,
Map<String, List<String>> requestHeaders) throws IOException {
String host = uri.getHost();
Map<String, List<String>> ret = new HashMap<String, List<String>>();
synchronized (cookies) {
List<String> store = cookies.get(host);
if (store != null) {
store = Collections.unmodifiableList(store);
ret.put("Cookie", store);
}
}
return Collections.unmodifiableMap(ret);
}
@Override
public void put(URI uri, Map<String, List<String>> responseHeaders)
throws IOException {
List<String> newCookies = responseHeaders.get("Set-Cookie");
if (newCookies != null) {
String host = uri.getHost();
synchronized (cookies) {
List<String> store = cookies.get(host);
if (store == null) {
store = new ArrayList<String>();
cookies.put(host, store);
}
store.addAll(newCookies);
}
}
}
}
ログインリクエストでログインできない他の問題があるにもかかわらず、ログインページが生成するCookieを保存して返さない限り、ダウンロードページに進むことはできません。
HTTP自体がステートレスであるため、現在のコードでは、リモートサーバーが2番目のダウンロード要求がログインしたばかりの同じユーザーからのものであることを通知する方法がありません。
Java CURLをご覧ください http://sourceforge.net/projects/javacurl。以前にhttpsウェブサイトにログインしてダウンロードするためにこれを使用しました。ブラウザIDのスプーフィングなどの機能があります。これにより、ログインにリダイレクトされる問題を解決できる可能性があります。
それらはEclipseプラグインを提供しますが、私はそれを使わずに使用し、正常に動作します。
代わりに、wgetを使用してjavaから呼び出すこともできます。
HttpUnit を試してみるとよいでしょう。ウェブサイトのテストを念頭に置いて書かれていますが、問題に役立つかもしれません。
ウェブサイトから:
&quot; ... HttpUnitはJavaで記述されており、フォーム送信、JavaScript、基本http認証、Cookie、自動ページリダイレクトなど、ブラウザーの動作の関連部分をエミュレートし、Javaテストコードが返されたページをテキスト、 XML DOM、またはフォーム、テーブル、リンクのコンテナ。&quot;