<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    列宿乃施于上榮兮 日月才經(jīng)于柍桭

    ………… 白駒過隙 歲月如斯 夢縈回繞 心靈之聲
    posts - 57, comments - 8, trackbacks - 0, articles - 41
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

      前段時(shí)間摸索過基于信息安全的Web service開發(fā),今天休息閑著也憋得慌,正好整理一下(參考網(wǎng)絡(luò)資料)。這里使用了WS-Security規(guī)范對SOAP包進(jìn)行加密與身份認(rèn)證。
          
      首先從http://www.xmltrustcenter.org獲得相關(guān)庫文件,分別是ws-security.jar和tsik.jar。ws-security.jar中包含一個(gè)WSSecurity類,我們使用它來對XML進(jìn)行數(shù)字簽名和驗(yàn)證,加密與解密。
      這里使用ISNetworks安全提供者,ISNetworks實(shí)現(xiàn)了RSA加密、解密算法。參考相關(guān)包ISNetworksProvider.jar。

      使用JDK自帶的工具創(chuàng)建密匙庫和信任庫,因?yàn)樵谡埱蠛晚憫?yīng)過程中都需要使用,所以需要生成兩對。建立批處理文件gen-cer-store.bat內(nèi)容如下:

       set SERVER_DN="CN=Server, OU=ec, O=ec, L=BEIJINGC, S=BEIJING, C=CN"
       set CLIENT_DN
    ="CN=Client, OU=ec, O=ec, L=BEIJING, S=BEIJING, C=CN"
       set KS_PASS
    =-storepass changeit
       set KEYINFO
    =-keyalg RSA
       
       keytool -genkey -alias Server -dname %SERVER_DN% %KS_PASS% -keystore server.keystore %KEYINFO% -keypass changeit
       keytool -export -alias Server -file test_axis.cer %KS_PASS% -keystore server.keystore
       keytool -import -file test_axis.cer %KS_PASS% -keystore client.truststore -alias serverkey -noprompt
       
       keytool -genkey -alias Client -dname %CLIENT_DN% %KS_PASS% -keystore client.keystore %KEYINFO% -keypass changeit
       keytool -export -alias Client -file test_axis.cer %KS_PASS% -keystore client.keystore
       keytool -import -file test_axis.cer %KS_PASS% -keystore server.truststore -alias clientkey -noprompt

      這里具體內(nèi)容含義不解釋了,自己可以在網(wǎng)絡(luò)上找來看看。
      執(zhí)行g(shù)en-cer-store.bat之后,我們可以得到四個(gè)文件server.keystore,server.truststore,client.keystore,client.truststore。

      
    基本流程如下: 
        1
    、 客戶端(WSSClient)發(fā)出調(diào)用Web服務(wù)請求; 
        2
    、 客戶端HandlerWSClientRequestHandler)截獲請求的SOAP消息; 
        3
    、 客戶端Handler對截獲的SOAP消息進(jìn)行數(shù)字簽名(使用client.keystore作為簽名依據(jù)); 
        4
    、 客戶端Handler對簽名后的SOAP消息進(jìn)行加密(使用RSA算法加密); 
        5
    、 被加密的SOAP消息通過互聯(lián)網(wǎng)傳送到目標(biāo)Web服務(wù)端口; 
        6
    、 服務(wù)器端HandlerWSServerRequestHandler)截獲加密的SOAP消息; 
        7
    、 服務(wù)器端Handler對加密的SOAP消息進(jìn)行解密; 
        8
    、 服務(wù)器端HandlerSOAP消息進(jìn)行身份驗(yàn)證(server.truststore包含了所信任的身份信息),如果驗(yàn)證不通過,將拋出異常; 
        9
    、 服務(wù)器端Handler刪除被解密后的SOAP消息中與WS-Security相關(guān)的元素; 
        10
    、 解密后的原始SOAP消息被發(fā)送到目標(biāo)Web服務(wù)端口;
        11
    、 目標(biāo)Web服務(wù)對Web服務(wù)請求進(jìn)行處理,然后返回響應(yīng)的SOAP消息; 
        12
    、 服務(wù)器端Handler(WSServerResponseHandler)截獲響應(yīng)的SOAP消息; 
        13
    、 服務(wù)器端Handler對截獲的SOAP消息進(jìn)行數(shù)字簽名(使用server.keystore作為簽名依據(jù)); 
        14
    、 服務(wù)器端Handler對簽名后的SOAP消息進(jìn)行加密(使用RSA算法加密); 
        15
    、 被加密的SOAP消息通過互聯(lián)網(wǎng)傳送到目客戶端; 
        16
    、 客戶端Handler(WSClientResponseHandler)截獲加密的SOAP消息; 
        17
    、 客戶端Handler對加密的SOAP消息進(jìn)行解密; 
        18
    、 客戶端HandlerSOAP消息進(jìn)行身份驗(yàn)證(client.truststore包含了所信任的身份信息),如果驗(yàn)證不通過,將拋出異常; 
        19
    、 客戶端Handler刪除被解密后的SOAP消息中與WS-Security相關(guān)的元素; 
        20
    、 被解密后的SOAP消息發(fā)送到目標(biāo)客戶端,客戶端輸出調(diào)用結(jié)果。
      
    從上面流程可以看出,在一個(gè)SOAP調(diào)用回合中,需要對SOAP消息進(jìn)行四次處理,在請求和響應(yīng)中都是簽名” -> “加密” -> “解密” -> “驗(yàn)證的過程。

      
    程序框架如下:

     WSClientHandler.java //基類,包含了一些公用方法
     WSClientRequestHandler.java //繼承于WSClientHandler.java,調(diào)用WSHelper.java對客戶端發(fā)出的XML文檔進(jìn)行加密
     WSClientResponseHandler.java //繼承于WSClientHandler.java,調(diào)用WSHelper.java對服務(wù)器端返回的XML文檔進(jìn)行解密
     WSServerHandler.java //基類,包含了一些公用方法
     WSServerRequestHandler.java //繼承于WSServerHandler.java,調(diào)用WSHelper.java對客戶端發(fā)出的加密后的XML文檔進(jìn)行解密
     WSServerResponseHandler.java//繼承于WSServerHandler.java,調(diào)用WSHelper.java對服務(wù)器端返回的XML文檔進(jìn)行加密
     WSSecurityHelper.java //核心類,對SOAP消息簽名、加密、解密、身份驗(yàn)證
     MessageConverter.java //幫助類,Document、SOAP消息互相轉(zhuǎn)換


      WSSecurityHelper.java主要包括方法如下:

        /**
         * 數(shù)字簽名
         
    */

        
    public static void sign(Document doc, String keystore, String storetype,
                String storepass, String alias, String keypass) 
    throws Exception {
            InputStream is 
    = WSSecurityHelper.class.getResourceAsStream(keystore);
            KeyStore keyStore 
    = KeyStore.getInstance(storetype);
            keyStore.load(is, storepass.toCharArray());
            PrivateKey key 
    = (PrivateKey) keyStore.getKey(alias, keypass
                    .toCharArray());
            X509Certificate cert 
    = (X509Certificate) keyStore.getCertificate(alias);

            SigningKey sk 
    = SigningKeyFactory.makeSigningKey(key);
            KeyInfo ki 
    = new KeyInfo();
            ki.setCertificate(cert);

            WSSecurity security 
    = new WSSecurity();
            security.sign(doc, sk, ki);
        }


        
    /**
         * 身份驗(yàn)證
         
    */

        
    public static boolean verify(Document doc, String keystore,
                String storetype, String storepass) 
    throws Exception {
            InputStream is 
    = WSSecurityHelper.class.getResourceAsStream(keystore);
            KeyStore keyStore 
    = KeyStore.getInstance(storetype);
            keyStore.load(is, storepass.toCharArray());

            TrustVerifier verifier 
    = new X509TrustVerifier(keyStore);

            WSSecurity security 
    = new WSSecurity();
            MessageValidity[] resa 
    = security.verify(doc, verifier, nullnull);
            
    if (resa.length > 0{
                
    return resa[0].isValid();
            }

            
    return false;
        }


        
    /**
         * 加密
         
    */

        
    public static void encrypt(Document doc, String keystore, String storetype,
                String storepass, String alias) 
    throws Exception {
            
    try {
                InputStream is 
    = WSSecurityHelper.class
                        .getResourceAsStream(keystore);
                KeyStore keyStore 
    = KeyStore.getInstance(storetype);
                keyStore.load(is, storepass.toCharArray());
                X509Certificate cert 
    = (X509Certificate) keyStore
                        .getCertificate(alias);
    // serverkey
                KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede",
                        PROVIDER);

                keyGenerator.init(
    168new SecureRandom());
                SecretKey key 
    = keyGenerator.generateKey();

                KeyInfo ki 
    = new KeyInfo();
                ki.setCertificate(cert);

                PublicKey pubk 
    = cert.getPublicKey();
                WSSecurity security 
    = new WSSecurity();
                security.encrypt(doc, key, AlgorithmType.TRIPLEDES, pubk,
                        AlgorithmType.RSA1_5, ki);
            }
     catch (Exception e) {
                e.printStackTrace();
            }

        }


        
    /**
         * 解密
         
    */

        
    public static void decrypt(Document doc, String keystore, String storetype,
                String storepass, String alias, String keypass) 
    throws Exception {
            InputStream is 
    = WSSecurityHelper.class.getResourceAsStream(keystore);
            java.security.KeyStore keyStore 
    = java.security.KeyStore
                    .getInstance(storetype);
            keyStore.load(is, storepass.toCharArray());
            PrivateKey prvk2 
    = (PrivateKey) keyStore.getKey(alias, keypass
                    .toCharArray());

            WSSecurity security 
    = new WSSecurity();
            security.decrypt(doc, prvk2, 
    null);
            removeWSSElements(doc);
        }


      MessageConverter.java
    實(shí)現(xiàn)如下:

    package com.macrowing.sys.security;

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.soap.MessageFactory;
    import javax.xml.soap.MimeHeaders;
    import javax.xml.soap.SOAPException;
    import javax.xml.soap.SOAPMessage;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerConfigurationException;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;

    import org.w3c.dom.Document;
    import org.xml.sax.SAXException;

    /**
     * Document對象與SOAPMessage對象相互轉(zhuǎn)換
     
    */

    public class MessageConverter {

        
    /**
         * Document轉(zhuǎn)換成SOAPMessage
         
    */

        
    public static SOAPMessage convertDocumentToSOAPMessage(Document doc)
                
    throws TransformerConfigurationException, TransformerException,
                SOAPException, IOException 
    {
            TransformerFactory transformerFactory 
    = TransformerFactory
                    .newInstance();
            Transformer transformer 
    = transformerFactory.newTransformer();

            ByteArrayOutputStream byteArrayOutputStream 
    = new ByteArrayOutputStream();
            transformer.transform(
    new DOMSource(doc), new StreamResult(
                    byteArrayOutputStream));
            MimeHeaders header 
    = new MimeHeaders();
            header.addHeader(
    "Content-Type""text/xml");
            MessageFactory factory 
    = MessageFactory.newInstance();
            SOAPMessage soapMsg 
    = factory.createMessage(header,
                    
    new ByteArrayInputStream(byteArrayOutputStream.toByteArray(),
                            
    0, byteArrayOutputStream.size()));
            
    return soapMsg;
        }


        
    /**
         * SOAPMessage轉(zhuǎn)換成Document
         
    */

        
    public static Document convertSoapMessageToDocument(SOAPMessage soapMsg)
                
    throws ParserConfigurationException, SAXException, SOAPException,
                IOException 
    {
            ByteArrayOutputStream byteArrayOutputStream 
    = new ByteArrayOutputStream();
            soapMsg.writeTo(byteArrayOutputStream);
            ByteArrayInputStream bais 
    = new ByteArrayInputStream(
                    byteArrayOutputStream.toByteArray(), 
    0, byteArrayOutputStream
                            .size());

            DocumentBuilderFactory documentBuilderFactory 
    = DocumentBuilderFactory
                    .newInstance();
            documentBuilderFactory.setNamespaceAware(
    true);
            DocumentBuilder documentBuilder 
    = documentBuilderFactory
                    .newDocumentBuilder();
            Document doc 
    = documentBuilder.parse(bais);
            
    return doc;
        }

    }


      WSClientHandler.java
    作為一個(gè)抽象類,主要初始化一些相關(guān)信息,invoke方法由其子類實(shí)現(xiàn),代碼如下:

    package com.macrowing.sys.security;

    import org.apache.axis.AxisFault;
    import org.apache.axis.MessageContext;
    import org.apache.axis.handlers.BasicHandler;

    public abstract class WSClientHandler extends BasicHandler {

        
    private static final long serialVersionUID = -4494231325476939491L;

        
    protected String keyStoreFile;
        
    protected String keyStoreType = "JKS";// 默認(rèn)
        protected String keyStorePassword;
        
    protected String keyAlias;
        
    protected String keyEntryPassword;
        
    protected String trustStoreFile;
        
    protected String trustStoreType = "JKS";// 默認(rèn)
        protected String trustStorePassword;
        
    protected String certAlias;

        
    public void setInitialization(String keyStoreFile, String keyStoreType,
                String keyStorePassword, String keyAlias, String keyEntryPassword,
                String trustStoreFile, String trustStoreType,
                String trustStorePassword, String certAlias) 
    {
            
    this.keyStoreFile = keyStoreFile;
            
    this.keyStoreType = keyStoreType;
            
    this.keyStorePassword = keyStorePassword;
            
    this.keyAlias = keyAlias;
            
    this.keyEntryPassword = keyEntryPassword;
            
    this.trustStoreFile = trustStoreFile;
            
    this.trustStoreType = trustStoreType;
            
    this.trustStorePassword = trustStorePassword;
            
    this.certAlias = certAlias;
        }


        
    public void setInitialization(String keyStoreFile, String keyStorePassword,
                String keyAlias, String keyEntryPassword, String trustStoreFile,
                String trustStorePassword, String certAlias) 
    {
            
    this.keyStoreFile = keyStoreFile;
            
    this.keyStorePassword = keyStorePassword;
            
    this.keyAlias = keyAlias;
            
    this.keyEntryPassword = keyEntryPassword;
            
    this.trustStoreFile = trustStoreFile;
            
    this.trustStorePassword = trustStorePassword;
            
    this.certAlias = certAlias;
        }


        
    public abstract void invoke(MessageContext messageContext) throws AxisFault;

        
    public void onFault(MessageContext msgContext) {
        }


    }


      WSClientRequestHandler.java
    實(shí)現(xiàn)代碼如下:

    package com.macrowing.sys.security;

    import javax.xml.soap.SOAPMessage;

    import org.apache.axis.AxisFault;
    import org.apache.axis.MessageContext;
    import org.w3c.dom.Document;

    public class WSClientRequestHandler extends WSClientHandler {

        
    private static final long serialVersionUID = -2966519798377660568L;

        
    public void invoke(MessageContext messageContext) throws AxisFault {
            System.out.println(
    "1.客戶端發(fā)出請求");
            
    try {
                SOAPMessage soapMessage 
    = messageContext.getMessage();
                Document doc 
    = MessageConverter
                        .convertSoapMessageToDocument(soapMessage);

                WSSecurityHelper.sign(doc, keyStoreFile, keyStoreType,
                        keyStorePassword, keyAlias, keyEntryPassword);

                WSSecurityHelper.encrypt(doc, trustStoreFile, trustStoreType,
                        trustStorePassword, certAlias);

                soapMessage 
    = MessageConverter.convertDocumentToSOAPMessage(doc);
                messageContext.setMessage(soapMessage);
            }
     catch (Exception e) {
                System.err.println(
    "在處理響應(yīng)時(shí)發(fā)生以下錯(cuò)誤: " + e);
                e.printStackTrace();
            }

        }


    }


      WSClientResponseHandler.java實(shí)現(xiàn)代碼如下:

    package com.macrowing.sys.security;

    import javax.xml.soap.SOAPMessage;

    import org.apache.axis.AxisFault;
    import org.apache.axis.MessageContext;
    import org.w3c.dom.Document;

    public class WSClientResponseHandler extends WSClientHandler {

        
    private static final long serialVersionUID = -8103853123763763505L;

        
    public void invoke(MessageContext messageContext) throws AxisFault {
            System.out.println(
    "4.客戶端接收響應(yīng)");
            
    try {
                SOAPMessage soapMessage 
    = messageContext.getCurrentMessage();
                Document doc 
    = MessageConverter
                        .convertSoapMessageToDocument(soapMessage);

                WSSecurityHelper.decrypt(doc, keyStoreFile, keyStoreType,
                        keyStorePassword, keyAlias, keyEntryPassword);

                WSSecurityHelper.verify(doc, trustStoreFile, trustStoreType,
                        trustStorePassword);

                WSSecurityHelper.removeWSSElements(doc);
                soapMessage 
    = MessageConverter.convertDocumentToSOAPMessage(doc);
                messageContext.setMessage(soapMessage);
            }
     catch (Exception e) {
                e.printStackTrace();
                System.err.println(
    "在處理響應(yīng)時(shí)發(fā)生以下錯(cuò)誤: " + e);
            }

        }


    }


      WSServerHandler.java
    同樣作為一個(gè)抽象類,主要初始化一些相關(guān)信息,invoke方法由其子類實(shí)現(xiàn),代碼如下:

    package com.macrowing.sys.security;

    import org.apache.axis.AxisFault;
    import org.apache.axis.MessageContext;
    import org.apache.axis.handlers.BasicHandler;

    public abstract class WSServerHandler extends BasicHandler {

        
    private static final long serialVersionUID = -5333475846617822121L;

        
    protected String keyStoreFile;
        
    protected String keyStoreType = "JKS";// 默認(rèn)
        protected String keyStorePassword;
        
    protected String keyAlias;
        
    protected String keyEntryPassword;
        
    protected String trustStoreFile;
        
    protected String trustStoreType = "JKS";// 默認(rèn)
        protected String trustStorePassword;
        
    protected String certAlias;

        
    public void onFault(MessageContext msgContext) {
        }


        
    /**
         * 初始化,從配置文件server-config.wsdd中讀取屬性
         
    */

        
    public void init() {
            keyStoreFile 
    = (String) getOption("keyStoreFile");
            
    if ((keyStoreFile == null)) {
                System.err
                        .println(
    "Please keyStoreFile configured for the Handler!");
            }


            trustStoreFile 
    = (String) getOption("trustStoreFile");
            
    if ((trustStoreFile == null)) {
                System.err
                        .println(
    "Please trustStoreFile configured for the Handler!");
            }


            keyStorePassword 
    = (String) getOption("keyStorePassword");
            
    if ((keyStorePassword == null)) {
                System.err
                        .println(
    "Please keyStorePassword configured for the Handler!");
            }


            keyAlias 
    = (String) getOption("keyAlias");
            
    if ((keyAlias == null)) {
                System.err.println(
    "Please keyAlias configured for the Handler!");
            }


            keyEntryPassword 
    = (String) getOption("keyEntryPassword");
            
    if ((keyEntryPassword == null)) {
                System.err
                        .println(
    "Please keyEntryPassword configured for the Handler!");
            }


            trustStorePassword 
    = (String) getOption("trustStorePassword");
            
    if ((trustStorePassword == null)) {
                System.err
                        .println(
    "Please trustStorePassword configured for the Handler!");
            }


            certAlias 
    = (String) getOption("certAlias");
            
    if ((certAlias == null)) {
                System.err.println(
    "Please certAlias configured for the Handler!");
            }


            
    if ((getOption("keyStoreType")) != null{
                keyStoreType 
    = (String) getOption("keyStoreType");
            }


            
    if ((getOption("trustStoreType")) != null{
                trustStoreType 
    = (String) getOption("trustStoreType");
            }

        }


        
    public abstract void invoke(MessageContext arg0) throws AxisFault;
        
    }


      WSServerRequestHandler.java
    實(shí)現(xiàn)代碼如下:

    package com.macrowing.sys.security;

    import javax.xml.soap.SOAPMessage;

    import org.apache.axis.AxisFault;
    import org.apache.axis.MessageContext;
    import org.w3c.dom.Document;

    public class WSServerRequestHandler extends WSServerHandler {

        
    private static final long serialVersionUID = 6462778870280567942L;

        
    public void invoke(MessageContext messageContext) throws AxisFault {
            System.out.println(
    "2.服務(wù)端接收請求");
            
    try {
                SOAPMessage msg 
    = messageContext.getCurrentMessage();
                Document doc 
    = MessageConverter.convertSoapMessageToDocument(msg);

                WSSecurityHelper.decrypt(doc, keyStoreFile, keyStoreType,
                        keyStorePassword, keyAlias, keyEntryPassword);

                WSSecurityHelper.verify(doc, trustStoreFile, trustStoreType,
                        trustStorePassword);

                WSSecurityHelper.removeWSSElements(doc);
                msg 
    = MessageConverter.convertDocumentToSOAPMessage(doc);
                messageContext.setMessage(msg);
            }
     catch (Exception e) {
                e.printStackTrace();
                System.err.println(
    "在處理響應(yīng)時(shí)發(fā)生以下錯(cuò)誤: " + e);
            }

        }


    }


      WSServerResponseHandler.java實(shí)現(xiàn)代碼如下:

    package com.macrowing.sys.security;

    import javax.xml.soap.SOAPMessage;

    import org.apache.axis.AxisFault;
    import org.apache.axis.MessageContext;
    import org.w3c.dom.Document;

    public class WSServerResponseHandler extends WSServerHandler {

        
    private static final long serialVersionUID = -2376918924804535243L;

        
    public void invoke(MessageContext messageContext) throws AxisFault {
            System.out.println(
    "3.服務(wù)端響應(yīng)請求");
            
    try {
                SOAPMessage soapMessage 
    = messageContext.getMessage();
                Document doc 
    = MessageConverter
                        .convertSoapMessageToDocument(soapMessage);

                WSSecurityHelper.sign(doc, keyStoreFile, keyStoreType,
                        keyStorePassword, keyAlias, keyEntryPassword);

                WSSecurityHelper.encrypt(doc, trustStoreFile, trustStoreType,
                        trustStorePassword, certAlias);

                soapMessage 
    = MessageConverter.convertDocumentToSOAPMessage(doc);
                messageContext.setMessage(soapMessage);
            }
     catch (Exception e) {
                System.err.println(
    "在處理響應(yīng)時(shí)發(fā)生以下錯(cuò)誤: " + e);
                e.printStackTrace();
            }

        }


    }


      這樣,基于WS-Security規(guī)范的SOAP安全程序框架建立好了。為了使用方便,可以把所有的class打包成jar包放在%TOMCAT_HOME%\webapps\axis\WEB-INF\lib目錄下。然后,如上文所述,將服務(wù)端的Handler發(fā)布于server-config.wsdd文件中,如下:

        <handler name="ServerRequestHandler" type="java:com.macrowing.sys.security.WSServerRequestHandler">
            
    <parameter name="keyStoreFile" value="server.keystore"/>
            
    <parameter name="trustStoreFile" value="server.truststore"/>
            
    <parameter name="keyStorePassword" value="changeit"/>
            
    <parameter name="keyAlias" value="Server"/>
            
    <parameter name="keyEntryPassword" value="changeit"/>
            
    <parameter name="trustStorePassword" value="changeit"/>
            
    <parameter name="certAlias" value="clientkey"/>
        
    </handler>
        
    <handler name="ServerResponseHandler" type="java:com.macrowing.sys.security.WSServerResponseHandler">
            
    <parameter name="keyStoreFile" value="server.keystore"/>
            
    <parameter name="trustStoreFile" value="server.truststore"/>
            
    <parameter name="keyStorePassword" value="changeit"/>
            
    <parameter name="keyAlias" value="Server"/>
            
    <parameter name="keyEntryPassword" value="changeit"/>
            
    <parameter name="trustStorePassword" value="changeit"/>
            
    <parameter name="certAlias" value="clientkey"/>
        
    </handler>

      并且不要忘記在需要保障信息安全的Web service中加入:

        <requestFlow>
            
    <handler type="soapmonitor"/>
            
    <handler type="ServerRequestHandler"/>
        
    </requestFlow>
        
    <responseFlow>
            
    <handler type="soapmonitor"/>
            
    <handler type="ServerResponseHandler"/>
        
    </responseFlow>


      好了,服務(wù)端程序部署完了,編寫客戶端程序WSClient.java測試:

        public static void main(String[] args) {
            
    try {
                String endpointURL 
    = "http://localhost:8080/axis/services/Hello";

                WSClientHandler handler 
    = new WSClientRequestHandler();
                handler.setInitialization(
    "client.keystore""changeit""Client",
                        
    "changeit""client.truststore""changeit""serverkey");
                WSClientHandler handlee 
    = new WSClientResponseHandler();
                handlee.setInitialization(
    "client.keystore""changeit""Client",
                        
    "changeit""client.truststore""changeit""serverkey");

                Service svc 
    = new Service();
                Call call 
    = (Call) svc.createCall();
                call.setClientHandlers(handler, handlee);
                call.setTargetEndpointAddress(
    new URL(endpointURL));
                call.setOperationName(
    new QName("sayHello"));

                call.invoke(
    new Object[] "apos" });

            }
     catch (Exception e) {
                e.printStackTrace();
            }

        }


      啟動(dòng)Tomcat,打開SOAP Monitor,然后運(yùn)行客戶端,OK,你可以看到在monitor上看到需要的效果了。


    評論

    # re: 基于Axis 1.X的Web Service開發(fā)(三)[未登錄]  回復(fù)  更多評論   

    2012-11-07 10:13 by 初學(xué)者
    受教了,轉(zhuǎn)了,謝謝博主

    主站蜘蛛池模板: 亚洲国产婷婷六月丁香| 亚洲日本va中文字幕久久| 精品亚洲成a人片在线观看少妇| 综合自拍亚洲综合图不卡区| 久青草视频在线观看免费| xxxxwww免费| 久久国产亚洲精品无码| 久久精品一本到99热免费| 亚洲国产高清在线| 国产h肉在线视频免费观看| 亚洲一区二区三区久久久久| 99久久免费国产精品特黄| 亚洲不卡av不卡一区二区| 中文字幕无码精品亚洲资源网久久| 久久久免费观成人影院| 亚洲va国产va天堂va久久| 免费的黄网站男人的天堂| 天堂亚洲免费视频| 香蕉免费看一区二区三区| 久久亚洲精品中文字幕三区| 中文字幕免费视频| 亚洲依依成人亚洲社区| 四虎影库久免费视频| 国产精品免费看久久久香蕉| 久久亚洲AV无码精品色午夜麻| 999国内精品永久免费观看| 亚洲精品无码成人| 91成人免费在线视频| 国产成人亚洲精品无码AV大片| 免费无码又爽又刺激聊天APP| 18禁亚洲深夜福利人口| 在线观看免费宅男视频| 一级毛片免费播放视频| 亚洲精品国产成人99久久| 成人午夜性A级毛片免费| 国产黄在线观看免费观看不卡| 亚洲精品线在线观看| 国产在线98福利播放视频免费| 亚洲AV成人精品一区二区三区| 亚洲国产一区二区三区| 最近新韩国日本免费观看|