Ввод и отправка формы POST на веб-сайт HTTPS с использованием Java - PullRequest
0 голосов
/ 23 января 2012

Что мне нужно сделать, так это направить Java на веб-страницу HTTPS, принять все сертификаты, заполнить форму, отправить данные через POST, а затем вывести источник полученной страницы. Как это было бы возможно в Java (особенно в рамках приложения для Android)?

Я собрал приведенный ниже код из "http://alien.dowling.edu/~vassil/tutorials/javapost.php" и ответа Кевина в" /1092689/kak-obrabatyvat-nedeistvitelnye-sertifikaty-ssl-s-apache-httpclient",, но при печати BufferedReader только распечатывает форму с заполненной информацией, а не источником результирующей страницы.

Когда вызывается submit, на странице запускается скрипт с использованием JavaScript, и сам URL не изменяется, но содержимое страницы изменяется, чтобы отражать возвращенные результаты скрипта. Однако текущая программа по-прежнему не возвращает источник новой обновленной страницы. - Парадиус только сейчас

Кто-нибудь из вас может показать мне, где этот код не работает? Заранее спасибо!

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;
        }

    }

1 Ответ

0 голосов
/ 23 января 2012

Прежде всего: не используйте подмены, доверяйте всем X509TrustManager, это плохая идея. Если вы используете самозаверяющий сертификат для сервера, вставьте его в приложение и инициализируйте с ним менеджер доверия. Есть множество сообщений о том, как это сделать правильно.

Если после вашего POST вы будете перенаправлены на страницу HTTP ( не HTTPS), HttpURLConnection не будет следовать за перенаправлением автоматически. Вам нужно будет проанализировать ответ вручную (проверьте код состояния 302 и т. Д.) И получить эту страницу, используя другой экземпляр HttpURLConnection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...