2012-01-22 35 views
0

我需要做的是將Java直接導入到HTTPS網頁,接受所有證書,填寫表單,通過POST提交數據,然後輸出結果頁面。在Java中這怎麼可能(特別是在Android應用程序的範圍內)?使用Java輸入並向HTTPS網站提交POST表單

我從「http://alien.dowling.edu/~vassil/tutorials/javapost.php」和Kevin的答案「http://stackoverflow.com/questions/1828775/httpclient-」中彙總了下面的代碼-ssl「,但打印BufferedReader只打印填充信息而不是結果頁面源的表單。

調用提交時,使用JavaScript在頁面上運行腳本,並且URL本身不會更改,但頁面內容確實會更改以反映腳本的返回結果。但是,當前程序仍然不會返回新更新頁面的來源。 - Paradius剛纔

你們中的任何人都可以告訴我這段代碼出錯的地方嗎?提前致謝!

import java.io.*; 
import java.net.*; 
import javax.net.ssl.*; 
import java.util.*; 

import java.security.SecureRandom; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

public class JavaPOST 
{ 

    public static void doSubmit(String url, Map<String, String> data) throws Exception 
    { 

      //SSL Certificate Acceptor 
      SSLContext ctx = SSLContext.getInstance("TLS"); 
      ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom()); 
      SSLContext.setDefault(ctx); 

      URL siteUrl = new URL(url); 
      HttpsURLConnection conn = (HttpsURLConnection)siteUrl.openConnection(); 
      conn.setRequestMethod("POST"); 
      conn.setDoOutput(true); 
      conn.setDoInput(true); 

      conn.setHostnameVerifier(
      new HostnameVerifier() 
      { 
       @Override 
       public boolean verify(String arg0, SSLSession arg1) 
       { 
        return true; 
       } 
      }); 

      DataOutputStream out = new DataOutputStream(conn.getOutputStream()); 

      Set keys = data.keySet(); 
      Iterator keyIter = keys.iterator(); 
      String content = ""; 
      for(int i=0; keyIter.hasNext(); i++) 
      { 
       Object key = keyIter.next(); 
       if(i!=0) 
       { 
        content += "&"; 
       } 
       content += key + "=" + URLEncoder.encode(data.get(key), "UTF-8"); 
      }   
      //System.out.println(content); 
      out.writeBytes(content); 
      out.flush(); 
      out.close(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      String line = ""; 
      while((line=in.readLine())!=null) 
      { 
       System.out.println(line); 
      } 

      System.out.println(conn.getURL()); 

    } 

    public static void main(String[] args) 
    { 
     Map<String, String> data = new HashMap<String, String>(); 
     data.put("start_time", "103000"); 
     data.put("end_time", "210000"); 

     try 
     { 
      doSubmit("https://somedomain/webpage.html", data); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

class DefaultTrustManager implements X509TrustManager 
{ 

     @Override 
     public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} 

     @Override 
     public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} 

     @Override 
     public X509Certificate[] getAcceptedIssuers() { 
      return null; 
     } 

    } 

回答

0

首先:不要使用化妝轉變,信任大家X509TrustManager,這是一個壞主意。如果您對服務器使用自簽名證書,請將其嵌入到應用程序中,並使用它初始化信任管理器。有很多關於如何正確使用它的文章。

如果您的POST後重定向到HTTP頁面(而不是 HTTPS),HttpURLConnection將不會自動執行重定向。您必須手動解析響應(檢查狀態碼302等),並使用另一個HttpURLConnection實例獲取該頁面。

+0

事實證明,我忘記提到當調用submit時,使用JavaScript在頁面上運行腳本,並且URL本身不會更改,但頁面內容確實會發生變化以反映腳本的返回結果。但是,當前程序仍然不會返回新更新頁面的來源。 – Paradius

+0

那麼,你的Android客戶端對JavaScript一無所知,所以它不可能得到結果。如果您需要運行腳本,則可能需要使用WebView。 –

+0

如果頁面本身運行腳本頁面將用戶重定向到同一頁面但具有不同的外觀並因此具有不同的來源,那麼這甚至是真的嗎? – Paradius