1、首先准备一个p12格式的服务端证书
无论是购买,还是用openssl或java keytool生成自签名证书都可以
2、在IIS7的根目录,选中“安全性->根目录证书”,选择“导入”即可
3、如果显示证书链有问题,则在IE中导入CA证书就好了
4、在需要HTTPS的网站上,选择“绑定”,绑定类型为https,选择需要的证书
5、在客户端的IE中,导入CA证书就好了
Learn and share.
1、首先准备一个p12格式的服务端证书
无论是购买,还是用openssl或java keytool生成自签名证书都可以
2、在IIS7的根目录,选中“安全性->根目录证书”,选择“导入”即可
3、如果显示证书链有问题,则在IE中导入CA证书就好了
4、在需要HTTPS的网站上,选择“绑定”,绑定类型为https,选择需要的证书
5、在客户端的IE中,导入CA证书就好了
1、SoapClient
package com.neohope;
import java.net.URL;
import java.rmi.RemoteException;
public class SoapClientTest {
public static void HelloHttp(String url) throws RemoteException
{
HelloStub h = new HelloStub(url);
com.neohope.HelloStub.HelloWorld hello = new com.neohope.HelloStub.HelloWorld();
hello.setName("Java http client");
com.neohope.HelloStub.HelloWorldResponse rsp = h.helloWorld(hello);
System.out.println(rsp.getHelloWorldResult());
}
public static void HelloHttps(String url,String trustStorePath,String trustStorePwd) throws RemoteException
{
URL jksurl = SoapClientTest.class.getClassLoader().getResource(
"myTrustStore.jks");
String jks = jksurl.getFile();
System.setProperty("javax.net.ssl.trustStore", jks);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePwd);
HelloStub h = new HelloStub(url);
com.neohope.HelloStub.HelloWorld hello = new com.neohope.HelloStub.HelloWorld();
hello.setName("Java https client");
com.neohope.HelloStub.HelloWorldResponse rsp = h.helloWorld(hello);
System.out.println(rsp.getHelloWorldResult());
}
public static void main(String[] args) throws RemoteException
{
//HelloHttp("http://localhost:80/Hello.asmx");
HelloHttps("https://localhost:443/Hello.asmx","myTrustStore.jks","sslTestPwd");
}
}
2、SoapClientWithContextTest
package com.neohope;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.rmi.RemoteException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
public class SoapClientWithContextTest {
public static void HelloHttp(String url) throws RemoteException
{
HelloStub h = new HelloStub(url);
com.neohope.HelloStub.HelloWorld hello = new com.neohope.HelloStub.HelloWorld();
hello.setName("Java http client");
com.neohope.HelloStub.HelloWorldResponse rsp = h.helloWorld(hello);
System.out.println(rsp.getHelloWorldResult());
}
public static void HelloHttps(String url,String trustStorePath,String trustStorePwd) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, CertificateException, FileNotFoundException, IOException
{
URL jksurl = SoapClientTest.class.getClassLoader().getResource(
"myTrustStore.jks");
String jks = jksurl.getFile();
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(new FileInputStream(jks), trustStorePwd.toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
trustManagerFactory.init(trustStore);
SSLContext sslContext = SSLContext.getInstance("TLSv1");
//SSLContext sslContext = SSLContext.getInstance("SSLv3");
sslContext.init(new KeyManager[0], trustManagerFactory.getTrustManagers(), null);
SSLContext.setDefault(sslContext);
HelloStub h = new HelloStub(url);
com.neohope.HelloStub.HelloWorld hello = new com.neohope.HelloStub.HelloWorld();
hello.setName("Java https client");
com.neohope.HelloStub.HelloWorldResponse rsp = h.helloWorld(hello);
System.out.println(rsp.getHelloWorldResult());
}
public static void main(String[] args) throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, FileNotFoundException, IOException
{
//HelloHttp("http://localhost:80/Hello.asmx");
HelloHttps("https://localhost:443/Hello.asmx","myTrustStore.jks","sslTestPwd");
}
}
3、SoapClientWithTrustManagerTest
可以绕过证书检查
package com.neohope;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.rmi.RemoteException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
public class SoapClientWithTrustManagerTest {
public static void HelloHttp(String url) throws RemoteException
{
HelloStub h = new HelloStub(url);
com.neohope.HelloStub.HelloWorld hello = new com.neohope.HelloStub.HelloWorld();
hello.setName("Java http client");
com.neohope.HelloStub.HelloWorldResponse rsp = h.helloWorld(hello);
System.out.println(rsp.getHelloWorldResult());
}
public static void HelloHttps(String url,String trustStorePath,String trustStorePwd) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, CertificateException, FileNotFoundException, IOException
{
SSLContext sslContext = SSLContext.getInstance("TLSv1");
//SSLContext sslContext = SSLContext.getInstance("SSLv3");
sslContext.init(new KeyManager[0], new TrustManager[] { new DefaultTrustManager() }, new SecureRandom());
SSLContext.setDefault(sslContext);
HelloStub h = new HelloStub(url);
com.neohope.HelloStub.HelloWorld hello = new com.neohope.HelloStub.HelloWorld();
hello.setName("Java https client");
com.neohope.HelloStub.HelloWorldResponse rsp = h.helloWorld(hello);
System.out.println(rsp.getHelloWorldResult());
}
private static 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;
}
}
public static void main(String[] args) throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, CertificateException, FileNotFoundException, IOException
{
//HelloHttp("http://localhost:80/Hello.asmx");
HelloHttps("https://localhost:443/Hello.asmx","myTrustStore.jks","sslTestPwd");
}
}
1、Axis2调用WebService一般有两种方法:
a、使用org.apache.axis2.rpc.client.RPCServiceClient自动生成PayLoad
b、使用org.apache.axis2.client.ServiceClient手动生成PayLoad
package com.ats.ws.client;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.apache.log4j.Logger;
import com.ats.db.Person;
import com.ats.db.PersonAddResponse;
public class WSInvoker
{
private static Logger logger = Logger.getLogger(WSInvoker.class);
private static void invokeWebServiceRPC()
{
try
{
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
options.setTo(new EndpointReference("http://localhost:8080/WebService1/services/PersonManager"));
// 调用Action
QName operation = new QName("http://ws.ats.com", "PersonAdd");
// 调用参数类型和参数值
Person p = new Person();
Object req[] = new Object[] { p };
p.setName("HI");
Class[] reqClasses = new Class[] { PersonAddResponse.class };
// 返回结果
Object[] rsp = serviceClient.invokeBlocking(operation, req, reqClasses);
PersonAddResponse r = (PersonAddResponse) rsp[0];
logger.debug(r.getOperationReult());
} catch (AxisFault e)
{
e.printStackTrace();
}
}
public static void invokeWebServiceDocument()
{
try
{
ServiceClient serviceClient = new ServiceClient();
Options opts = new Options();
opts.setTo(new EndpointReference("http://localhost:8080/WebService1/services/PersonManager"));
opts.setAction("urn:PersonAdd");
serviceClient.setOptions(opts);
// 发送请求并并得到返回结果
OMElement res = serviceClient.sendReceive(createPayLoad());
logger.debug(res.getFirstElement().getText());
} catch (AxisFault e)
{
e.printStackTrace();
}
}
public static OMElement createPayLoad()
{
OMFactory fac = OMAbstractFactory.getOMFactory();
// 命名空间
OMNamespace omNsXSD = fac.createOMNamespace("http://ws.ats.com", "xsd");
OMNamespace omNsXS = fac.createOMNamespace("http://www.w3.org/2001/XMLSchema", "xs");
// 指定方法
OMElement method = fac.createOMElement("PersonAdd", omNsXSD);
// 指定方法的参数
OMElement p1 = fac.createOMElement("person", omNsXS);
OMElement personName = fac.createOMElement("personName", omNsXS);
personName.setText("personName");
p1.addChild(personName);
OMElement personid=fac.createOMElement("personid", omNsXS);
personid.setText("");
p1.addChild(personid);
method.addChild(p1);
return method;
}
public static void main(String[] args)
{
WSInvoker.invokeWebServiceRPC();
WSInvoker.invokeWebServiceDocument();
}
}
2、要想看到网络通讯的话,在log4j的配置文件中增加:
<category name="org.apache.commons.httpclient"> <priority value="WARN" /> </category> <category name="httpclient.wire"> <priority value="DEBUG" /> </category>
1、发布的几种方式
POJO+axis2-war:
这种方式比较适合简单功能,直接写一个POJO,放到axis2-war下的pojo目录即可
AAR+axis2-war:
这种方式比较适合发布,将服务打成aar包,放到axis2-war下的service目录即可
web+axis2:
这种方式比较适合调试,将axis2集成到web工程,个人比较喜欢这个方式
2、Service组成
a、服务类
PersonManager.java
package com.ats.ws;
import com.ats.db.Person;
import com.ats.db.PersonAddResponse;
import com.ats.db.PersonDAO;
public class PersonManager {
public PersonAddResponse PersonAdd(Person person)
{
PersonAddResponse rsp = new PersonAddResponse();
//PersonDAO dao = new PersonDAO();
//rsp.setOperationReult(dao.InsertPerson(person));
return rsp;
}
}
b、服务描述文件
services/Person/META-INF/services.xml
<?xml version="1.0" encoding="UTF-8"?> <service name="PersonManager"> <description>PersonManagere</description> <parameter name="ServiceClass">com.ats.ws.PersonManager</parameter> <operation name="PersonAdd"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> </service>
c、wsdl
可以自动生成,一般不需要指定
3、Axis2集成到WebApp的方式
a、axis2-web拷贝到project/WebContent下
b、conf、modules、services拷贝到project/WebContent/WEB-INF下
c、所需lib,拷贝到project/WebContent/WEB-INF/lib下
c、web.xml增加下面内容:
<servlet> <servlet-name>AxisServlet</servlet-name> <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>AxisAdminServlet</servlet-name> <servlet-class>org.apache.axis2.webapp.AxisAdminServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/servlet/AxisServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>*.jws</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisAdminServlet</servlet-name> <url-pattern>/axis2-admin/*</url-pattern> </servlet-mapping>
只要设置下面几个环境变量就好啦;)
public static final String TRUST_STORE_PASSWORD = "javax.net.ssl.trustStorePassword"; public static final String TRUST_STORE = "javax.net.ssl.trustStore"; public static final String TRUST_STORE_TYPE = "javax.net.ssl.trustStoreType"; public static final String KEY_STORE_TYPE = "javax.net.ssl.keyStoreType"; public static final String KEY_STORE_PASSWORD = "javax.net.ssl.keyStorePassword"; public static final String KEY_STORE = "javax.net.ssl.keyStore";