同样的,如果你没听说过WSS或不知道什么是WSS请先看一下WSS方面的资料,我在这主要是讲一下如果应用WSS.
在我的WEBSERVICE的例子的基础上我们来实现WSS
首先我们用KEYTOOL生成一对JKS文件,service.jks和client.jks.
service.jks存放了SERVICE的私钥和CLIENT的公钥.
client.jks存放了CLIENT的私钥和SERVICE的公钥.
本人生成的SERVICE的私钥别名是yskyserver,KEYSTORE的密码是111111
SERVICE的公钥别名是yskyserver,KEYSTORE的密码是111111,CLIENT的私钥别名是yskyclient,KEYSTORE的密码是111111,
CLIENT的公钥别名是yskyclient,KEYSTORE的密码是111111.
(注如果不会用KEYTOOL请自己看相关资料,也可以等我的下一篇文章)
在正式开始前还要去下载一个rampart-1.1.mar,把这个东东放到AXIS2_HOME/repository/modules下去
这个东东是在AXIS2上实现WSS4J必需要的一个组件.
再重新生成AXIS2的WAR包
先来看SERVICE服务
首先在services.xml文件中加上WSS的定义
加完内容如下:
<service name="yskyAxis2Service">
<description> The description of the ysky's service </description>
<parameter name="ServiceClass" locked="xsd:false">com.ysky.service.yskyWebService</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<!--******************************************************************-->
<module ref="rampart" />
<parameter name="InflowSecurity">
<action>
<items>Timestamp Signature Encrypt</items>
<passwordCallbackClass>com.ysky.service.wss.PWCallback</passwordCallbackClass>
<signaturePropFile>service.properties</signaturePropFile>
</action>
</parameter>
<parameter name="OutflowSecurity">
<action>
<items>Timestamp Signature Encrypt</items>
<user>yskyserver</user>
<passwordCallbackClass>com.ysky.service.wss.PWCallback</passwordCallbackClass>
<signaturePropFile>service.properties</signaturePropFile>
<signatureKeyIdentifier>SKIKeyIdentifier</signatureKeyIdentifier>
<encryptionKeyIdentifier>SKIKeyIdentifier</encryptionKeyIdentifier>
<encryptionUser>yskyclient</encryptionUser>
<encryptionKeyTransportAlgorithm>http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p</encryptionKeyTransportAlgorithm>
</action>
</parameter>
<--*********************************************************************-->
</service>
其中*号注释部份为WSS定义
上面定义中用到了一个叫PWCallback的类内容如下:
package com.ysky.service.wss;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;
public class PWCallback implements CallbackHandler{
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof WSPasswordCallback) {
WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
pc.setPassword("111111");
}
}
}
}
在config目录下新建一个keys目录,把我们刚才生成的那个service.jks放到keys目录下
再在config目录下新建一个service.properties文件,内容如下:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=111111
org.apache.ws.security.crypto.merlin.file=keys/service.jks
service端就设置好了
我们再来看一下client端
先把AXIS2的下的所有JAR包加到CLIENT的LIB下面去
再COPY AXIS2_HOME/repository/modules目录到CLIENT/CONFIG下面
在config目录下新建一个keys目录,把我们刚才生成的那个client.jks放到keys目录下
再在config目录下新建一个client.properties文件,内容如下:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=111111
org.apache.ws.security.crypto.merlin.file=keys/client.jks
再在config目录下新建一个client.properties文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<axisconfig name="AxisJava2.0">
<!--******************************************************************-->
<module ref="rampart" />
<!-- sample-10 : MTOM optimize encrypted content -->
<parameter name="OutflowSecurity">
<action>
<items>Timestamp Signature Encrypt</items>
<user>yskyclient</user>
<passwordCallbackClass>com.ysky.client.wss.PWCallback</passwordCallbackClass>
<signaturePropFile>client.properties</signaturePropFile>
<signatureKeyIdentifier>DirectReference</signatureKeyIdentifier>
<encryptionKeyIdentifier>SKIKeyIdentifier</encryptionKeyIdentifier>
<encryptionUser>yskyserver</encryptionUser>
<optimizeParts>//xenc:EncryptedData/xenc:CipherData/xenc:CipherValue</optimizeParts>
<encryptionKeyTransportAlgorithm>http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p</encryptionKeyTransportAlgorithm>
</action>
</parameter>
<parameter name="InflowSecurity">
<action>
<items>Timestamp Signature Encrypt</items>
<passwordCallbackClass>com.ysky.client.wss.PWCallback</passwordCallbackClass>
<signaturePropFile>client.properties</signaturePropFile>
</action>
</parameter>
<!--******************************************************************-->
<!-- ================================================= -->
<!-- Parameters -->
<!-- ================================================= -->
<parameter name="hotdeployment" locked="false">true</parameter>
<parameter name="hotupdate" locked="false">false</parameter>
<parameter name="enableMTOM" locked="false">false</parameter>
<!--During a fault, stacktrace can be sent with the fault message. The following flag will control -->
<!--that behaviour.-->
<parameter name="sendStacktraceDetailsWithFaults" locked="false">true</parameter>
<!--If there aren't any information available to find out the fault reason, we set the message of the exception-->
<!--as the faultreason/Reason. But when a fault is thrown from a service or some where, it will be -->
<!--wrapped by different levels. Due to this the initial exception message can be lost. If this flag-->
<!--is set then, Axis2 tries to get the first exception and set its message as the faultreason/Reason.-->
<parameter name="DrillDownToRootCauseForFaultReason" locked="false">false</parameter>
<!--This is the user name and password of admin console-->
<parameter name="userName" locked="false">admin</parameter>
<parameter name="password" locked="false">axis2</parameter>
<!--To override repository/services you need to uncomment following parameter and value SHOULD be absolute file path.-->
<!--<parameter name="services" locked="false">service</parameter>-->
<!--To override repository/modules you need to uncomment following parameter and value SHOULD be absolute file path-->
<!--<parameter name="modules" locked="false">modules</parameter>-->
<!--Following params will set the proper context paths for invocations. All the endpoints will have a commons context-->
<!--root which can configured using the following contextRoot parameter-->
<!--<parameter name="contextRoot" locked="false">axis2</parameter>-->
<!--Our HTTP endpoints can handle both REST and SOAP. Following parameters can be used to distinguish those endpoints-->
<!--<parameter name="servicePath" locked="false">services</parameter>-->
<!--<parameter name="restPath" locked="false">rest</parameter>-->
<!--Set the flag to true if you want to enable transport level session management-->
<parameter name="manageTransportSession" locked="false">false</parameter>
<!--Following two parameters will be used to handle REST in Axis2. The default settings will make Axis2 to have two-->
<!--different endpoints, one for REST (AxisRESTServlet) one for SOAP message handling (AxisServlet). But following-->
<!--parameters help to tweak the message handling of two main servlets. -->
<!-- If the enableRESTInAxis2MainServlet is true, then Axis2MainServlet will handle both SOAP and REST messages -->
<parameter name="enableRESTInAxis2MainServlet" locked="true">true</parameter>
<!-- Following parameter will completely disable REST handling in both the servlets-->
<parameter name="disableREST" locked="true">false</parameter>
<!-- This will disable the separate servlet we have for REST handling. -->
<parameter name="disableSeparateEndpointForREST" locked="true">false</parameter>
<!-- ================================================= -->
<!-- Message Receivers -->
<!-- ================================================= -->
<!--This is the Default Message Receiver for the system , if you want to have MessageReceivers for -->
<!--all the other MEP implement it and add the correct entry to here , so that you can refer from-->
<!--any operation -->
<!--Note : You can override this for particular service by adding the same element with your requirement-->
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</messageReceivers>
<!-- ================================================= -->
<!-- Target Resolvers -->
<!-- ================================================= -->
<!-- Uncomment the following and specify the class name for your TargetResolver to add -->
<!-- a TargetResolver. TargetResolvers are used to process the To EPR for example to -->
<!-- choose a server in a cluster -->
<!--<targetResolvers>-->
<!--<targetResolver class="" />-->
<!--</targetResolvers>-->
<!-- ================================================= -->
<!-- Transport Ins -->
<!-- ================================================= -->
<transportReceiver name="http"
class="org.apache.axis2.transport.http.SimpleHTTPServer">
<parameter name="port" locked="false">6060</parameter>
<!--If you want to give your own host address for EPR generation-->
<!--uncomment following parameter , and set as you required.-->
<!--<parameter name="hostname" locked="false">http://myApp.com/ws</parameter>-->
</transportReceiver>
<transportReceiver name="tcp"
class="org.apache.axis2.transport.tcp.TCPServer">
<parameter name="port" locked="false">6061</parameter>
<!--If you want to give your own host address for EPR generation-->
<!--uncomment following parameter , and set as you required.-->
<!--<parameter name="hostname" locked="false">tcp://myApp.com/ws</parameter>-->
</transportReceiver>
<!-- ================================================= -->
<!-- Transport Outs -->
<!-- ================================================= -->
<transportSender name="jms"
class="org.apache.axis2.transport.jms.JMSSender"/>
<transportSender name="tcp"
class="org.apache.axis2.transport.tcp.TCPTransportSender"/>
<transportSender name="local"
class="org.apache.axis2.transport.local.LocalTransportSender"/>
<transportSender name="http"
class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
<parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
<parameter name="Transfer-Encoding" locked="false">chunked</parameter>
</transportSender>
<transportSender name="https"
class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
<parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
<parameter name="Transfer-Encoding" locked="false">chunked</parameter>
</transportSender>
<!-- ================================================= -->
<!-- Phases -->
<!-- ================================================= -->
<phaseOrder type="InFlow">
<!-- System pre-defined phases -->
<phase name="Transport">
<handler name="RequestURIBasedDispatcher"
class="org.apache.axis2.engine.RequestURIBasedDispatcher">
<order phase="Transport"/>
</handler>
<handler name="SOAPActionBasedDispatcher"
class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
<order phase="Transport"/>
</handler>
</phase>
<phase name="Security"/>
<phase name="PreDispatch"/>
<phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
<handler name="AddressingBasedDispatcher"
class="org.apache.axis2.engine.AddressingBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="SOAPMessageBodyBasedDispatcher"
class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="InstanceDispatcher"
class="org.apache.axis2.engine.InstanceDispatcher">
<order phase="Dispatch"/>
</handler>
</phase>
<!-- System pre defined phases -->
<!-- After Postdispatch phase module author or or service author can add any phase he want -->
<phase name="OperationInPhase"/>
</phaseOrder>
<phaseOrder type="OutFlow">
<!-- user can add his own phases to this area -->
<phase name="OperationOutPhase"/>
<!--system predefined phase-->
<!--these phase will run irrespective of the service-->
<phase name="PolicyDetermination"/>
<phase name="MessageOut"/>
<phase name="Security"/>
</phaseOrder>
<phaseOrder type="InFaultFlow">
<phase name="PreDispatch"/>
<phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
<handler name="RequestURIBasedDispatcher"
class="org.apache.axis2.engine.RequestURIBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="SOAPActionBasedDispatcher"
class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="AddressingBasedDispatcher"
class="org.apache.axis2.engine.AddressingBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="SOAPMessageBodyBasedDispatcher"
class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="InstanceDispatcher"
class="org.apache.axis2.engine.InstanceDispatcher">
<order phase="Dispatch"/>
</handler>
</phase>
<!-- user can add his own phases to this area -->
<phase name="OperationInFaultPhase"/>
</phaseOrder>
<phaseOrder type="OutFaultFlow">
<!-- user can add his own phases to this area -->
<phase name="OperationOutFaultPhase"/>
<phase name="PolicyDetermination"/>
<phase name="MessageOut"/>
</phaseOrder>
</axisconfig>
上面这个文件内容也是我从WSS4J的例子上COPY下来的,有很多地方可能没什么用.但我没有去研究过
其中<!--******************************************************************-->包含的部份是WSS4J用到的
配好了!写个例子看看吧
unittest的例子代码:
public class webserviceTest extends TestCase {
private final String CLIENT_REPO_PATH = "." + File.separator + "config";
private final String axis2_xml = CLIENT_REPO_PATH + File.separator
+ "client-axis2.xml";
private static String toEPR = "http://localhost:8080/Axis2Test/services/yskyAxis2Service?wsdl";
private ConfigurationContext configContext = null;
private YskyAxis2ServiceStub serviceClient = null;
@Override
protected void setUp() throws Exception {
super.setUp();
configContext = ConfigurationContextFactory
.createConfigurationContextFromFileSystem(CLIENT_REPO_PATH,
axis2_xml);
serviceClient = new YskyAxis2ServiceStub(configContext, toEPR);
}
public void testAuthenticatePass() throws Exception {
CredentialsMessage msg = new CredentialsMessage();
msg.setPassword("test");
msg.setUsername("test");
Authenticate ath = new Authenticate();
ath.setParam0(msg);
assertEquals("testtest", serviceClient.authenticate(ath).get_return());
}
}
在我的WEBSERVICE的例子的基础上我们来实现WSS
首先我们用KEYTOOL生成一对JKS文件,service.jks和client.jks.
service.jks存放了SERVICE的私钥和CLIENT的公钥.
client.jks存放了CLIENT的私钥和SERVICE的公钥.
本人生成的SERVICE的私钥别名是yskyserver,KEYSTORE的密码是111111
SERVICE的公钥别名是yskyserver,KEYSTORE的密码是111111,CLIENT的私钥别名是yskyclient,KEYSTORE的密码是111111,
CLIENT的公钥别名是yskyclient,KEYSTORE的密码是111111.
(注如果不会用KEYTOOL请自己看相关资料,也可以等我的下一篇文章)
在正式开始前还要去下载一个rampart-1.1.mar,把这个东东放到AXIS2_HOME/repository/modules下去
这个东东是在AXIS2上实现WSS4J必需要的一个组件.
再重新生成AXIS2的WAR包
先来看SERVICE服务
首先在services.xml文件中加上WSS的定义
加完内容如下:
<service name="yskyAxis2Service">
<description> The description of the ysky's service </description>
<parameter name="ServiceClass" locked="xsd:false">com.ysky.service.yskyWebService</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<!--******************************************************************-->
<module ref="rampart" />
<parameter name="InflowSecurity">
<action>
<items>Timestamp Signature Encrypt</items>
<passwordCallbackClass>com.ysky.service.wss.PWCallback</passwordCallbackClass>
<signaturePropFile>service.properties</signaturePropFile>
</action>
</parameter>
<parameter name="OutflowSecurity">
<action>
<items>Timestamp Signature Encrypt</items>
<user>yskyserver</user>
<passwordCallbackClass>com.ysky.service.wss.PWCallback</passwordCallbackClass>
<signaturePropFile>service.properties</signaturePropFile>
<signatureKeyIdentifier>SKIKeyIdentifier</signatureKeyIdentifier>
<encryptionKeyIdentifier>SKIKeyIdentifier</encryptionKeyIdentifier>
<encryptionUser>yskyclient</encryptionUser>
<encryptionKeyTransportAlgorithm>http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p</encryptionKeyTransportAlgorithm>
</action>
</parameter>
<--*********************************************************************-->
</service>
其中*号注释部份为WSS定义
上面定义中用到了一个叫PWCallback的类内容如下:
package com.ysky.service.wss;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;
public class PWCallback implements CallbackHandler{
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof WSPasswordCallback) {
WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
pc.setPassword("111111");
}
}
}
}
在config目录下新建一个keys目录,把我们刚才生成的那个service.jks放到keys目录下
再在config目录下新建一个service.properties文件,内容如下:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=111111
org.apache.ws.security.crypto.merlin.file=keys/service.jks
service端就设置好了
我们再来看一下client端
先把AXIS2的下的所有JAR包加到CLIENT的LIB下面去
再COPY AXIS2_HOME/repository/modules目录到CLIENT/CONFIG下面
在config目录下新建一个keys目录,把我们刚才生成的那个client.jks放到keys目录下
再在config目录下新建一个client.properties文件,内容如下:
org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=jks
org.apache.ws.security.crypto.merlin.keystore.password=111111
org.apache.ws.security.crypto.merlin.file=keys/client.jks
再在config目录下新建一个client.properties文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<axisconfig name="AxisJava2.0">
<!--******************************************************************-->
<module ref="rampart" />
<!-- sample-10 : MTOM optimize encrypted content -->
<parameter name="OutflowSecurity">
<action>
<items>Timestamp Signature Encrypt</items>
<user>yskyclient</user>
<passwordCallbackClass>com.ysky.client.wss.PWCallback</passwordCallbackClass>
<signaturePropFile>client.properties</signaturePropFile>
<signatureKeyIdentifier>DirectReference</signatureKeyIdentifier>
<encryptionKeyIdentifier>SKIKeyIdentifier</encryptionKeyIdentifier>
<encryptionUser>yskyserver</encryptionUser>
<optimizeParts>//xenc:EncryptedData/xenc:CipherData/xenc:CipherValue</optimizeParts>
<encryptionKeyTransportAlgorithm>http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p</encryptionKeyTransportAlgorithm>
</action>
</parameter>
<parameter name="InflowSecurity">
<action>
<items>Timestamp Signature Encrypt</items>
<passwordCallbackClass>com.ysky.client.wss.PWCallback</passwordCallbackClass>
<signaturePropFile>client.properties</signaturePropFile>
</action>
</parameter>
<!--******************************************************************-->
<!-- ================================================= -->
<!-- Parameters -->
<!-- ================================================= -->
<parameter name="hotdeployment" locked="false">true</parameter>
<parameter name="hotupdate" locked="false">false</parameter>
<parameter name="enableMTOM" locked="false">false</parameter>
<!--During a fault, stacktrace can be sent with the fault message. The following flag will control -->
<!--that behaviour.-->
<parameter name="sendStacktraceDetailsWithFaults" locked="false">true</parameter>
<!--If there aren't any information available to find out the fault reason, we set the message of the exception-->
<!--as the faultreason/Reason. But when a fault is thrown from a service or some where, it will be -->
<!--wrapped by different levels. Due to this the initial exception message can be lost. If this flag-->
<!--is set then, Axis2 tries to get the first exception and set its message as the faultreason/Reason.-->
<parameter name="DrillDownToRootCauseForFaultReason" locked="false">false</parameter>
<!--This is the user name and password of admin console-->
<parameter name="userName" locked="false">admin</parameter>
<parameter name="password" locked="false">axis2</parameter>
<!--To override repository/services you need to uncomment following parameter and value SHOULD be absolute file path.-->
<!--<parameter name="services" locked="false">service</parameter>-->
<!--To override repository/modules you need to uncomment following parameter and value SHOULD be absolute file path-->
<!--<parameter name="modules" locked="false">modules</parameter>-->
<!--Following params will set the proper context paths for invocations. All the endpoints will have a commons context-->
<!--root which can configured using the following contextRoot parameter-->
<!--<parameter name="contextRoot" locked="false">axis2</parameter>-->
<!--Our HTTP endpoints can handle both REST and SOAP. Following parameters can be used to distinguish those endpoints-->
<!--<parameter name="servicePath" locked="false">services</parameter>-->
<!--<parameter name="restPath" locked="false">rest</parameter>-->
<!--Set the flag to true if you want to enable transport level session management-->
<parameter name="manageTransportSession" locked="false">false</parameter>
<!--Following two parameters will be used to handle REST in Axis2. The default settings will make Axis2 to have two-->
<!--different endpoints, one for REST (AxisRESTServlet) one for SOAP message handling (AxisServlet). But following-->
<!--parameters help to tweak the message handling of two main servlets. -->
<!-- If the enableRESTInAxis2MainServlet is true, then Axis2MainServlet will handle both SOAP and REST messages -->
<parameter name="enableRESTInAxis2MainServlet" locked="true">true</parameter>
<!-- Following parameter will completely disable REST handling in both the servlets-->
<parameter name="disableREST" locked="true">false</parameter>
<!-- This will disable the separate servlet we have for REST handling. -->
<parameter name="disableSeparateEndpointForREST" locked="true">false</parameter>
<!-- ================================================= -->
<!-- Message Receivers -->
<!-- ================================================= -->
<!--This is the Default Message Receiver for the system , if you want to have MessageReceivers for -->
<!--all the other MEP implement it and add the correct entry to here , so that you can refer from-->
<!--any operation -->
<!--Note : You can override this for particular service by adding the same element with your requirement-->
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</messageReceivers>
<!-- ================================================= -->
<!-- Target Resolvers -->
<!-- ================================================= -->
<!-- Uncomment the following and specify the class name for your TargetResolver to add -->
<!-- a TargetResolver. TargetResolvers are used to process the To EPR for example to -->
<!-- choose a server in a cluster -->
<!--<targetResolvers>-->
<!--<targetResolver class="" />-->
<!--</targetResolvers>-->
<!-- ================================================= -->
<!-- Transport Ins -->
<!-- ================================================= -->
<transportReceiver name="http"
class="org.apache.axis2.transport.http.SimpleHTTPServer">
<parameter name="port" locked="false">6060</parameter>
<!--If you want to give your own host address for EPR generation-->
<!--uncomment following parameter , and set as you required.-->
<!--<parameter name="hostname" locked="false">http://myApp.com/ws</parameter>-->
</transportReceiver>
<transportReceiver name="tcp"
class="org.apache.axis2.transport.tcp.TCPServer">
<parameter name="port" locked="false">6061</parameter>
<!--If you want to give your own host address for EPR generation-->
<!--uncomment following parameter , and set as you required.-->
<!--<parameter name="hostname" locked="false">tcp://myApp.com/ws</parameter>-->
</transportReceiver>
<!-- ================================================= -->
<!-- Transport Outs -->
<!-- ================================================= -->
<transportSender name="jms"
class="org.apache.axis2.transport.jms.JMSSender"/>
<transportSender name="tcp"
class="org.apache.axis2.transport.tcp.TCPTransportSender"/>
<transportSender name="local"
class="org.apache.axis2.transport.local.LocalTransportSender"/>
<transportSender name="http"
class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
<parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
<parameter name="Transfer-Encoding" locked="false">chunked</parameter>
</transportSender>
<transportSender name="https"
class="org.apache.axis2.transport.http.CommonsHTTPTransportSender">
<parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter>
<parameter name="Transfer-Encoding" locked="false">chunked</parameter>
</transportSender>
<!-- ================================================= -->
<!-- Phases -->
<!-- ================================================= -->
<phaseOrder type="InFlow">
<!-- System pre-defined phases -->
<phase name="Transport">
<handler name="RequestURIBasedDispatcher"
class="org.apache.axis2.engine.RequestURIBasedDispatcher">
<order phase="Transport"/>
</handler>
<handler name="SOAPActionBasedDispatcher"
class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
<order phase="Transport"/>
</handler>
</phase>
<phase name="Security"/>
<phase name="PreDispatch"/>
<phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
<handler name="AddressingBasedDispatcher"
class="org.apache.axis2.engine.AddressingBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="SOAPMessageBodyBasedDispatcher"
class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="InstanceDispatcher"
class="org.apache.axis2.engine.InstanceDispatcher">
<order phase="Dispatch"/>
</handler>
</phase>
<!-- System pre defined phases -->
<!-- After Postdispatch phase module author or or service author can add any phase he want -->
<phase name="OperationInPhase"/>
</phaseOrder>
<phaseOrder type="OutFlow">
<!-- user can add his own phases to this area -->
<phase name="OperationOutPhase"/>
<!--system predefined phase-->
<!--these phase will run irrespective of the service-->
<phase name="PolicyDetermination"/>
<phase name="MessageOut"/>
<phase name="Security"/>
</phaseOrder>
<phaseOrder type="InFaultFlow">
<phase name="PreDispatch"/>
<phase name="Dispatch" class="org.apache.axis2.engine.DispatchPhase">
<handler name="RequestURIBasedDispatcher"
class="org.apache.axis2.engine.RequestURIBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="SOAPActionBasedDispatcher"
class="org.apache.axis2.engine.SOAPActionBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="AddressingBasedDispatcher"
class="org.apache.axis2.engine.AddressingBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="SOAPMessageBodyBasedDispatcher"
class="org.apache.axis2.engine.SOAPMessageBodyBasedDispatcher">
<order phase="Dispatch"/>
</handler>
<handler name="InstanceDispatcher"
class="org.apache.axis2.engine.InstanceDispatcher">
<order phase="Dispatch"/>
</handler>
</phase>
<!-- user can add his own phases to this area -->
<phase name="OperationInFaultPhase"/>
</phaseOrder>
<phaseOrder type="OutFaultFlow">
<!-- user can add his own phases to this area -->
<phase name="OperationOutFaultPhase"/>
<phase name="PolicyDetermination"/>
<phase name="MessageOut"/>
</phaseOrder>
</axisconfig>
上面这个文件内容也是我从WSS4J的例子上COPY下来的,有很多地方可能没什么用.但我没有去研究过
其中<!--******************************************************************-->包含的部份是WSS4J用到的
配好了!写个例子看看吧
unittest的例子代码:
public class webserviceTest extends TestCase {
private final String CLIENT_REPO_PATH = "." + File.separator + "config";
private final String axis2_xml = CLIENT_REPO_PATH + File.separator
+ "client-axis2.xml";
private static String toEPR = "http://localhost:8080/Axis2Test/services/yskyAxis2Service?wsdl";
private ConfigurationContext configContext = null;
private YskyAxis2ServiceStub serviceClient = null;
@Override
protected void setUp() throws Exception {
super.setUp();
configContext = ConfigurationContextFactory
.createConfigurationContextFromFileSystem(CLIENT_REPO_PATH,
axis2_xml);
serviceClient = new YskyAxis2ServiceStub(configContext, toEPR);
}
public void testAuthenticatePass() throws Exception {
CredentialsMessage msg = new CredentialsMessage();
msg.setPassword("test");
msg.setUsername("test");
Authenticate ath = new Authenticate();
ath.setParam0(msg);
assertEquals("testtest", serviceClient.authenticate(ath).get_return());
}
}