我需要做的是将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;
}
}
答案 0 :(得分:0)
首先:不要使用生产转移,信任 - 所有人X509TrustManager
,这是一个坏主意。如果您使用服务器的自签名证书,请将其嵌入应用程序中,并使用它初始化信任管理器。如何正确地做有很多帖子。
如果在POST后您被重定向到HTTP页面(不是 HTTPS),HttpURLConnection
将不会自动跟随重定向。您必须手动解析响应(检查状态代码302等)并使用另一个HttpURLConnection
实例获取该页面。