2012-01-22 3 views
0

Java를 HTTPS 웹 페이지로 보내고 모든 인증서를 수락하고 양식을 작성하고 POST를 통해 데이터를 제출 한 다음 소스를 출력합니다. 결과 페이지. 자바에서 어떻게 가능할까요? (특히 안드로이드 앱의 범위 내에서)?Java를 사용하여 HTTPS 웹 사이트에 POST 양식 입력 및 제출

"http://alien.dowling.edu/~vassil/tutorials/javapost.php"에서 아래 코드를 조합하고 "http://stackoverflow.com/questions/1828775/httpclient-and"에있는 Kevin의 답변을 작성했습니다. -ssl "이지만 BufferedReader를 인쇄하면 결과 페이지의 소스 대신 정보가 채워진 양식 만 인쇄됩니다.

제출이 호출되면 JavaScript는 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

제출이 호출 될 때 JavaScript가 JavaScript를 사용하여 스크립트가 실행되고 URL 자체는 변경되지 않지만 페이지의 내용이 스크립트의 반환 된 결과를 반영하도록 변경된다는 사실을 잊어 버렸습니다. . 그러나 현재 프로그램은 여전히 ​​새 업데이트 된 페이지의 원본을 반환하지 않습니다. – Paradius

+0

글쎄, 안드로이드 클라이언트는 자바 스크립트에 대해 아무 것도 모른다. 따라서 결과를 얻을 수있는 방법이 없다. 스크립트를 실행해야하는 경우 대신 WebView가 필요할 수 있습니다. –

+0

페이지가 스크립트를 실행하면 페이지가 다른 페이지로 이동하지만 모양이 다르기 때문에 사용자가 다른 소스를 "리디렉션"하는 경우에도 마찬가지입니다. – Paradius