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";