2009-01-07 116 views
3

我必須登錄到https網頁並使用Java下載文件。 我知道所有的URL事先:如何從Java的https網頁登錄並下載文件?

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")); 

如果我嘗試在Web瀏覽器如Firefox所有這些鏈接,他們的工作。

現在,當我做的:

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再次,我不能繼續進行文件下載。

謝謝!

回答

5

我同意參宿一的問題可能是存儲和返回cookie。

我用過的另一個不錯的選擇是來自Jakarta Commons的HttpClient

值得一提的是,如果這是您控制的服務器,您應該知道發送用戶名和密碼爲querystrings並不安全(即使您使用的是HTTPS)。 HttpClient支持使用POST發送參數,您應該考慮這一點。

+1

如何使用GET使其不太安全。據我所知,當使用HTTPS時,沒有任何東西在網絡上以未加密方式傳輸,包括請求的頁面地址。 – Kibbee 2009-01-07 18:09:54

2

我想說看看Java CURL http://sourceforge.net/projects/javacurl。我以前用它登錄到https網站並下載東西,它具有欺騙瀏覽器ID等功能。這可能會解決您重定向回登錄問題。

雖然他們提供了一個eclipse插件,但我沒有使用它,它工作正常。

或者,您可以使用wget並從java中調用它。

3

儘管您可能還有其他一些問題阻止了登錄請求的登錄,但除非您保存並返回任何登錄頁面生成的cookie,否則您不可能繼續進入下載頁面。

這是因爲HTTP本身是無狀態的,所以在當前的代碼有沒有辦法遠程服務器,告訴第二下載請求是從剛剛登錄同一用戶。

1

也許你想嘗試HttpUnit。儘管以網站測試爲基礎編寫,但它可能適用於您的問題。

從他們的網站:

」 ... Java編寫的,HttpUnit的模擬瀏覽器行爲的相關部分,包括表單提交,JavaScript中,基本HTTP身份驗證,餅乾和自動頁面重定向,以及允許Java測試代碼檢查返回的頁面是文本,XML DOM還是表單,表格和鏈接的容器。「

4

如前所述,您必須在請求之間維護會話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); 
      } 
     } 
    } 

}