JAVA怎样调用https类型的webservice

作者&投稿:函紫 (若有异议请与网页底部的电邮联系)
JAVA怎样调用https类型的webservice~

第一步按照Axis生成本地访问客户端,完成正常的webservice调用的开发,这里的细节我就不再描述,重点说明和http不同的地方-证书的生成和使用。这里假设需要访问的网址是https://www.abc.com ,那么就需要生成网址的安全证书设置到系统属性中,并且需要在调用代码前。如下图

第二步就是介绍怎样生成证书,先写一个InstallCert.java类放到自己电脑的D盘根目录下,(注意这个类是没有包名的)类中代码如下:
/**
*
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class InstallCert {
public static void main(String[] args) throws Exception {
String host;
int port;
char[] passphrase;
if ((args.length == 1) || (args.length == 2)) {
String[] c = args[0].split(":");
host = c[0];
port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
String p = (args.length == 1) ? "changeit" : args[1];
passphrase = p.toCharArray();
} else {
System.out
.println("Usage: java InstallCert [:port] [passphrase]");
return;
}

File file = new File("jssecacerts");
if (file.isFile() == false) {
char SEP = File.separatorChar;
File dir = new File(System.getProperty("java.home") + SEP + "lib"
+ SEP + "security");
file = new File(dir, "jssecacerts");
if (file.isFile() == false) {
file = new File(dir, "cacerts");
}
}
System.out.println("Loading KeyStore " + file + "...");
InputStream in = new FileInputStream(file);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(in, passphrase);
in.close();

SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf
.getTrustManagers()[0];
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory factory = context.getSocketFactory();

System.out
.println("Opening connection to " + host + ":" + port + "...");
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.setSoTimeout(10000);
try {
System.out.println("Starting SSL handshake...");
socket.startHandshake();
socket.close();
System.out.println();
System.out.println("No errors, certificate is already trusted");
} catch (SSLException e) {
System.out.println();
e.printStackTrace(System.out);
}

X509Certificate[] chain = tm.chain;
if (chain == null) {
System.out.println("Could not obtain server certificate chain");
return;
}

BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));

System.out.println();
System.out.println("Server sent " + chain.length + " certificate(s):");
System.out.println();
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
MessageDigest md5 = MessageDigest.getInstance("MD5");
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
System.out.println(" " + (i + 1) + " Subject "
+ cert.getSubjectDN());
System.out.println(" Issuer " + cert.getIssuerDN());
sha1.update(cert.getEncoded());
System.out.println(" sha1 " + toHexString(sha1.digest()));
md5.update(cert.getEncoded());
System.out.println(" md5 " + toHexString(md5.digest()));
System.out.println();
}

System.out
.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
String line = reader.readLine().trim();
int k;
try {
k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
} catch (NumberFormatException e) {
System.out.println("KeyStore not changed");
return;
}

X509Certificate cert = chain[k];
String alias = host + "-" + (k + 1);
ks.setCertificateEntry(alias, cert);

OutputStream out = new FileOutputStream("jssecacerts");
ks.store(out, passphrase);
out.close();

System.out.println();
System.out.println(cert);
System.out.println();
System.out
.println("Added certificate to keystore 'jssecacerts' using alias '"
+ alias + "'");
}

private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

private static String toHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (int b : bytes) {
b &= 0xff;
sb.append(HEXDIGITS[b >> 4]);
sb.append(HEXDIGITS[b & 15]);
sb.append(' ');
}
return sb.toString();
}

private static class SavingTrustManager implements X509TrustManager {

private final X509TrustManager tm;
private X509Certificate[] chain;

SavingTrustManager(X509TrustManager tm) {
this.tm = tm;
}

public X509Certificate[] getAcceptedIssuers() {
throw new UnsupportedOperationException();
}

public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
throw new UnsupportedOperationException();
}

public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
this.chain = chain;
tm.checkServerTrusted(chain, authType);
}
}

}
将上面的InstallCert.java编译成InstallCert.class文件放到自己电脑的D盘根目录下。这是正常的情况下D盘根目录下会有3个文件,如下图:

打开cmd进入到d盘开始执行生成证书命令,我这里不便于那我的网址测试我用支付宝的网址来测试的,输入:java InstallCert www.alipay.com 如下图


当出现了:Enter certificate to add to trusted keystore or 'q' to quit: [1]
这行代码时,输入1,回车。正常执行完后在D盘根目录下就会出现证书“jssecacerts”文件,具体如下图:


6
得到证书后将证书拷贝到$JAVA_HOME/jre/lib/security目录下,我这里是win7系统,在尝试的过程中需要将证书重命名为:cacerts 放进去才会有用。(这个步骤在不同的环境和操作系统下有点不同,需要注意)

public static org.apache.http.client.HttpClient wrapClient(org.apache.http.client.HttpClient base) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@SuppressWarnings("unused")
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
@SuppressWarnings("unused")
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain,
String authType)
throws java.security.cert.CertificateException {

}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain,
String authType)
throws java.security.cert.CertificateException {

}
};
ctx.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", 443, ssf));
ThreadSafeClientConnManager mgr = new ThreadSafeClientConnManager(registry);
return new DefaultHttpClient(mgr, base.getParams());
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}


初始化httpclient 的时候加上:
HttpClient client = new DefaultHttpClient();
client = WebClientDevWrapper.wrapClient(client);
HttpPost post = new HttpPost(url);

第一步按照Axis生成本地访问客户端,完成正常的webservice调用的开发,这里的细节我就不再描述,重点说明和http不同的地方-证书的生成和使用。这里假设需要访问的网址是https://www.abc.com ,那么就需要生成网址的安全证书设置到系统属性中,并且需要在调用代码前。
第二步
第二步就是介绍怎样生成证书,先写一个InstallCert.java类放到自己电脑的D盘根目录下,(注意这个类是没有包名的)类中代码如下:
/**
*
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class InstallCert {
public static void main(String[] args) throws Exception {
String host;
int port;
char[] passphrase;
if ((args.length == 1) || (args.length == 2)) {
String[] c = args[0].split(":");
host = c[0];
port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
String p = (args.length == 1) ? "changeit" : args[1];
passphrase = p.toCharArray();
} else {
System.out
.println("Usage: java InstallCert <host>[:port] [passphrase]");
return;
}

File file = new File("jssecacerts");
if (file.isFile() == false) {
char SEP = File.separatorChar;
File dir = new File(System.getProperty("java.home") + SEP + "lib"
+ SEP + "security");
file = new File(dir, "jssecacerts");
if (file.isFile() == false) {
file = new File(dir, "cacerts");
}
}
System.out.println("Loading KeyStore " + file + "...");
InputStream in = new FileInputStream(file);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(in, passphrase);
in.close();

SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf
.getTrustManagers()[0];
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory factory = context.getSocketFactory();

System.out
.println("Opening connection to " + host + ":" + port + "...");
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.setSoTimeout(10000);
try {
System.out.println("Starting SSL handshake...");
socket.startHandshake();
socket.close();
System.out.println();
System.out.println("No errors, certificate is already trusted");
} catch (SSLException e) {
System.out.println();
e.printStackTrace(System.out);
}

X509Certificate[] chain = tm.chain;
if (chain == null) {
System.out.println("Could not obtain server certificate chain");
return;
}

BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));

System.out.println();
System.out.println("Server sent " + chain.length + " certificate(s):");
System.out.println();
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
MessageDigest md5 = MessageDigest.getInstance("MD5");
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
System.out.println(" " + (i + 1) + " Subject "
+ cert.getSubjectDN());
System.out.println(" Issuer " + cert.getIssuerDN());
sha1.update(cert.getEncoded());
System.out.println(" sha1 " + toHexString(sha1.digest()));
md5.update(cert.getEncoded());
System.out.println(" md5 " + toHexString(md5.digest()));
System.out.println();
}

System.out
.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
String line = reader.readLine().trim();
int k;
try {
k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
} catch (NumberFormatException e) {
System.out.println("KeyStore not changed");
return;
}

X509Certificate cert = chain[k];
String alias = host + "-" + (k + 1);
ks.setCertificateEntry(alias, cert);

OutputStream out = new FileOutputStream("jssecacerts");
ks.store(out, passphrase);
out.close();

System.out.println();
System.out.println(cert);
System.out.println();
System.out
.println("Added certificate to keystore 'jssecacerts' using alias '"
+ alias + "'");
}

private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

private static String toHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (int b : bytes) {
b &= 0xff;
sb.append(HEXDIGITS[b >> 4]);
sb.append(HEXDIGITS[b & 15]);
sb.append(' ');
}
return sb.toString();
}

private static class SavingTrustManager implements X509TrustManager {

private final X509TrustManager tm;
private X509Certificate[] chain;

SavingTrustManager(X509TrustManager tm) {
this.tm = tm;
}

public X509Certificate[] getAcceptedIssuers() {
throw new UnsupportedOperationException();
}

public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
throw new UnsupportedOperationException();
}

public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
this.chain = chain;
tm.checkServerTrusted(chain, authType);
}
}

}
第三
将上面的InstallCert.java编译成InstallCert.class文件放到自己电脑的D盘根目录下。这是正常的情况下D盘根目录下会有3个文件
第四
打开cmd进入到d盘开始执行生成证书命令,我这里不便于那我的网址测试我用支付宝的网址来测试的
当出现了:Enter certificate to add to trusted keystore or 'q' to quit: [1]
这行代码时,输入1,回车。正常执行完后在D盘根目录下就会出现证书“jssecacerts”文件
得到证书后将证书拷贝到$JAVA_HOME/jre/lib/security目录下,我这里是win7系统,在尝试的过程中需要将证书重命名为:cacerts 放进去才会有用。
去年在ITjob刘老师那边听他说过,你试试看行不行。

1.打开webService链接,右键属性—》证书—》详细信息—》复制到文件,保存cer格式的文件。

2. 复制下面的cmd命令,执行keytool命令,生成keystore文件,例如
c:\nciic.keystore

keytool -import -alias nciic -file c:\jswszx.cer -keystore c:\nciic.keystore

它会提示输入密码,随便输入,例如:123456,回车
4.他会提示是否信任这个认证,输入Y,回车,指定目录下就会生成nciic.keystore文件

它会提示输入密码,随便输入,例如:123456,回车
4.他会提示是否信任这个认证,输入Y,回车,指定目录下就会生成nciic.keystore文件

5.修改Java代码
在调用接口方法之前,添加如下代码:
System.setProperty("javax.NET.ssl.trustStore","c://nciic.keystore"); System.setProperty("java.protocol.handler.pkgs","com.sun.Net.ssl.internal.www.protocol");
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

我这里有一个利用axis2 来实现 WEBService操作XML 接收、解析、传输的一个实例。下面贴出部分代码,你可以先看下,再看下我的采纳率,觉得可以就追问我。
private static EndpointReference targetEPR = new EndpointReference(" ");

public static OMElement getPricePayload(String username) {

OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(" ", "tns");

OMElement method = fac.createOMElement("getReportForm", omNs);
OMElement value = fac.createOMElement("username", omNs);

value.addChild(fac.createOMText(value, username));

method.addChild(value);

return method;
}

public static void main(String[] args) {

try {
OMElement getPricePayload=getPricePayload("admin");
Options options=new Options();
options.setTo(targetEPR);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
ServiceClient sender;
sender = new ServiceClient();
sender.setOptions(options);
Thread.sleep(3000);

OMElement result=sender.sendReceive(getPricePayload);

System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}

}


我想自己组装一台电脑,是用来玩游戏的,如魔兽、AVA之类。价位在3500左...
华硕 M4A88T-M主板采用了880G+SB710芯片组,支持高达5200MT\/s的HT 3.0系统总线;并对AMD最新的AM3和多核处理器进行优化, AMD AM3处理器配备独特的三级高速缓存,具有极佳的超频能力和更低的功耗。主板集成了HD 4250显示芯片,支持DirectX 10.1, OpenGL 2.0, Shader Model 4.1, Universal Video...

显卡、CPU等问题!我要组装一部电脑
我打算组装一部电脑,首先我是一个完完全全的小白,不知道硬件怎样配才合理,我是玩游戏的,而且玩的都是极品飞车14啊、虐杀原型2(准备出)、等等要求配置高的游戏,还玩AVA、卡丁车... 我打算组装一部电脑,首先我是一个完完全全的小白,不知道硬件怎样配才合理,我是玩游戏的,而且玩的都是极品飞车14啊、虐杀原型...

这样的配置是不是买个2G内存条就可以玩流畅地CF和AVA
g31集成显卡可以流畅的玩CF,目前配置足够用了,ava我没玩过 具体不知道 如果你想升级的话 搭配比较合理的升级方式是加一根1g内存 然后升级一个独立显卡 像二手的8600gt 9500gt ht3650 不到一百元 你的主板支持niter奔腾e2000系列双核cpu 建议你先100多元换个奔腾e2210 90元加个1g内存 然后升级一个...

手机:汉泰HT890手机内存卡里游戏的文件夹名叫什么名字?
有的手机 如果你把原来的名字改了 他下边又会出来个相同的文件夹的 比如GAME 你改成游戏了 他下边就会自动出现一个GAME文件夹 但里边什么也没有 这个方法你可以试试 说不定可行 一般放游戏的文件夹就那么几个名字:GAME(大写) GAVA Mulgame mythroad downdata\/MR 我知道的就这几个了 ...

我这个配置玩AVA为什么FPS才30+?家里是新安装的4M光纤,网速还可以...
这是你自己攒的电脑么 不知道520这种老板子是不能满足GT560 无论是总线带宽还是供电 520是HT1.0的总线 简直糟蹋了这张显卡 GT560等级 最少需要970 或A75

amd athlin 7550 的问题
本人 也是7750 的cpu (最后楼主占cpu的情况来说 本人玩ava 才70% 用瑞星杀毒才占50% 楼主情况有点不对劲 下图夫 ht 貌似不可能是1千 好像都是1800

战地之王7级图标怎么搞
怎么点亮战地之王图标? 只要达到上等兵(所需经验值:8500)或功勋点达到100点,即可点亮AVA图标!没玩过AVA的,请先看战地之王新手视频教程。 战地之王图标升级规则及功勋系统说明:QQ空间 温馨提示: 功勋系统暂不支持点亮\\升级\\熄灭图标,仅进行获取功勋点的计算及排行,所有数据均有可能根据玩家情况进行调整...

我是QQ会员,怎么开通战地之王
` http:\/\/ava.qq.com\/act\/a20090522honor\/index.ht 注:为了保证玩家资料及活动数据的稳定,图标点亮延迟开放,敬请期待,谢谢支持 最近几天图标访问量太多,导致无法登陆 所以暂时无法点亮与升级 很快会解决的,已经可以登陆并领取Q会员的额外功勋点了,3月22号 下午6点 ...

战地之王怎麼升级到2级图标?
50000 9 18 3.如果我更改绑定大区,那么功勋点将如何计算?您每天获取的功勋点将计算在您绑定的大区角色内,如您更改了绑定大区,功勋点将于您修改后次日累计计算在新大区角色中。4.如何领取我的功勋奖励 进入“我的功勋”—“我的功勋奖励”页卡查看并进行兑换。50个功勋点即可进行兑换AVA游戏金币10000。

福鼎市15045577373: java怎么调用https接口 -
子车媚甲磺: 方法:只要New一个Map,然后把要传递的参数以键值对的形式存入Map即可. private void Example() { String url =地址; Map param = new HashMap(); p.put("ParamName", "ParamValue"); String html = this.visitURL(url, param); }

福鼎市15045577373: JAVA怎样调用https类型的webservice -
子车媚甲磺: 1.打开webService链接,右键属性—》证书—》详细信息—》复制到文件,保存cer格式的文件.2. 复制下面的cmd命令,执行keytool命令,生成keystore文件,例如 c:\nciic.keystore keytool -import -alias nciic -file c:\jswszx.cer -keystore c:\nciic....

福鼎市15045577373: 怎样用java调用https接口 -
子车媚甲磺: 下面这个函数可以直接用:public static String requsetUrl(String urls) throws Exception{BufferedReader br = null;String sTotalString= "";try{URL url = new URL(urls);URLConnection connection = url.openConnection();connection....

福鼎市15045577373: 如何使用JAVA请求HTTPS -
子车媚甲磺: //处理http请求 requestUrl为请求地址 requestMethod请求方式,值为"GET"或"POST" public static String httpRequest(String requestUrl,String requestMethod,String outputStr){ StringBuffer buffer=null; try{ URL url=new URL(requestUrl); ...

福鼎市15045577373: 用java调用https webservice,该怎么处理 -
子车媚甲磺: public String sendPost(String url, String param) { String requestData = param;//参数 String requsetString = url;//远程接口地址 // First create a trust manager that won't care. //信任任何证书 X509TrustManager trustManager = new X509...

福鼎市15045577373: java如何调用对方http接口 新手虚心求教 -
子车媚甲磺: /*** 程序中访问http数据接口*/ public static String getURLContent(String urlStr) {/** 网络的url地址 */ URL url = null;/** http连接 */ HttpURLConnection httpConn = null;/**//** 输入流 */ BufferedReader in = null; StringBuffer sb = new StringBuffer(); try { ...

福鼎市15045577373: java系统怎样配置一个接收https请求的web服务 -
子车媚甲磺: server.xml里 有一个https的端口可以配置,访问那个端口就是了

福鼎市15045577373: https怎么用java进行访问 -
子车媚甲磺: 没有证书认证的,如果想访问支付宝等,需要配置一个访问的公钥 public class HttpClient { private String charset = "UTF-8"; private boolean safe = false; private String url; Map<String, String> headers = null; public HttpClient(String url) { this.url =...

福鼎市15045577373: java 怎样接受https请求 -
子车媚甲磺: 如果原生的话,通过web.xml配置servlet,然后你的url定位到这个servlet就行了.

福鼎市15045577373: php怎么调用java的https方式的webservice接口 -
子车媚甲磺: webservice 发展了好久了,有好多种客户端部署调用方式 ,流程大致是先创建服务,再调用. 下面的代码是创建一个简单的Webservice服务. server.php <?php require_once "lib/nusoap.php"; function webserver() { return "This is a ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网