使用Java输入POST表单并将其提交到HTTPS网站

时间:2012-01-22 20:54:20

标签: java android forms http

我需要做的是将Java直接连接到HTTPS网页,接受所有证书,填写表单,通过POST提交数据,然后输出结果页面的来源。如何在Java中实现这一点(特别是在Android应用程序的范围内)?

我在“http://alien.dowling.edu/~vassil/tutorials/javapost.php”和Kevin的回答“http://stackoverflow.com/questions/1828775/httpclient-and-中汇总了以下代码。 ssl“,但打印BufferedReader只会打印出填充信息的表单,而不是结果页面的来源。

调用submit时,将使用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;
        }

    }

1 个答案:

答案 0 :(得分:0)

首先:不要使用生产转移,信任 - 所有人X509TrustManager,这是一个坏主意。如果您使用服务器的自签名证书,请将其嵌入应用程序中,并使用它初始化信任管理器。如何正确地做有很多帖子。

如果在POST后您被重定向到HTTP页面(不是 HTTPS),HttpURLConnection将不会自动跟随重定向。您必须手动解析响应(检查状态代码302等)并使用另一个HttpURLConnection实例获取该页面。