Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java向HTTPS网站输入并提交帖子表单_Java_Android_Forms_Http - Fatal编程技术网

使用Java向HTTPS网站输入并提交帖子表单

使用Java向HTTPS网站输入并提交帖子表单,java,android,forms,http,Java,Android,Forms,Http,我需要做的是将Java引导到HTTPS网页,接受所有证书,填写表单,通过POST提交数据,然后输出结果页面的源代码。这在Java中是如何实现的(特别是在Android应用程序的范围内) 下面的代码是我从“http://alien.dowling.edu/~vassil/tutorials/javapost.php“和凯文的答案”http://stackoverflow.com/questions/1828775/httpclient-and-ssl,但打印BufferedReader只打印填写了

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

下面的代码是我从“http://alien.dowling.edu/~vassil/tutorials/javapost.php“和凯文的答案”http://stackoverflow.com/questions/1828775/httpclient-and-ssl,但打印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;
        }

    }
import java.io.*;
导入java.net。*;
导入javax.net.ssl.*;
导入java.util.*;
导入java.security.SecureRandom;
导入java.security.cert.CertificateException;
导入java.security.cert.x509证书;
公共类JavaPOST
{
公共静态void doSubmit(字符串url、映射数据)引发异常
{
//SSL证书接受程序
SSLContext ctx=SSLContext.getInstance(“TLS”);
init(new KeyManager[0],new TrustManager[]{new DefaultTrustManager()},new SecureRandom());
SSLContext.setDefault(ctx);
URL siteUrl=新URL(URL);
HttpsURLConnection conn=(HttpsURLConnection)siteUrl.openConnection();
conn.setRequestMethod(“POST”);
连接设置输出(真);
conn.setDoInput(真);
conn.setHostnameVerifier(
新主机名验证程序()
{
@凌驾
公共布尔验证(字符串arg0,SSLSession arg1)
{
返回true;
}
});
DataOutputStream out=新的DataOutputStream(conn.getOutputStream());
Set keys=data.keySet();
迭代器keyIter=keys.Iterator();
字符串内容=”;
for(int i=0;keyIter.hasNext();i++)
{
objectkey=keyIter.next();
如果(i!=0)
{
内容+=“&”;
}
content+=key+“=”+urlcoder.encode(data.get(key),“UTF-8”);
}           
//系统输出打印项次(内容);
out.writeBytes(内容);
out.flush();
out.close();
BufferedReader in=新的BufferedReader(新的InputStreamReader(conn.getInputStream());
字符串行=”;
而((line=in.readLine())!=null)
{
系统输出打印项次(行);
}
System.out.println(conn.getURL());
}
公共静态void main(字符串[]args)
{
映射数据=新的HashMap();
数据。put(“开始时间”,“103000”);
数据出售(“结束时间”,“210000”);
尝试
{
多苏米特(“https://somedomain/webpage.html“,数据);
}
捕获(例外e)
{
e、 printStackTrace();
}
}
}
类DefaultTrustManager实现X509TrustManager
{
@凌驾
public void checkClientTrusted(X509Certificate[]arg0,字符串arg1)抛出CertificateException{}
@凌驾
public void checkServerTrusted(X509Certificate[]arg0,字符串arg1)引发CertificateException{}
@凌驾
公共X509证书[]getAcceptedIssuers(){
返回null;
}
}

首先也是最重要的一点:不要使用临时的方法,相信每个人
X509TrustManager
,这是个坏主意。如果您正在为服务器使用自签名证书,请将其嵌入应用程序中,并使用它初始化信任管理器。关于如何正确地做这件事,有很多帖子


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

事实证明,我忘记了在调用submit时,使用JavaScript在页面上运行脚本,URL本身不会更改,但页面内容会更改以反映脚本返回的结果。然而,当前的程序仍然没有返回新更新页面的源代码。好吧,你的Android客户端对JavaScript一无所知,因此无法获得结果。如果您需要运行脚本,您可能需要一个WebView。如果页面本身运行脚本,页面会“重定向”用户到同一页面,但外观不同,因此源代码也不同,这是真的吗?不幸的是,我对AJAX不太熟悉。如何确定页面是否使用AJAX?我所知道的是,当表单数据提交时,页面的一部分会被更新。如果页面上的脚本正在使用XmlHttpRequest或类似工具执行POST或GET以获取一些数据,那么它将使用AJAX。