使用Java向HTTPS网站输入并提交帖子表单
我需要做的是将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本身不会更改,但页面内容会更改以反映脚本返回的结果。但是,当前程序仍然不会返回新更新页面的来源帕拉迪乌斯刚才 你们谁能告诉我这个代码哪里出错了吗?提前谢谢使用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只打印填写了
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。