有时候我们的webservice在服务端需要做一个调用方的验证,以保证我们的服务只有指定的客户才能使用。虽然可以使用wss4j的方法来做安全验证,但是考虑到我们的项目会与被.net平台下的项目调用,为了避免跨平台间出现的问题,我们还是决定采用自定义soapheader的形式来添加验证信息。
先来看一下客户端发起请求的soap内容
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:apac="http://apache.org/">
<soapenv:Header/>
<soapenv:Body>
<apac:CyfTest>
<!--Optional:-->
<arg0>?</arg0>
<!--Optional:-->
<arg1>?</arg1>
</apac:CyfTest>
</soapenv:Body>
</soapenv:Envelope>
其中红字部分就是我们要添加自定义信息的位置,再来看一下客户端的spring配置文件
<bean id="TsbServiceFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="address"
value="http://localhost:8080/TsbWebService/Cyf?wsdl"></property>
<property name="serviceClass" value="tsb.ws.tsbinterface.ICyfClient"></property>
<property name="outInterceptors">
<list>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<bean class="tsb.ws.common.authentication.AddPptSoapHeader"></bean>
</list>
</property>
</bean>
其中红色部分指定的类就是用来在请求的soap协议中加上自定义头部信息的处理类,处理类内容如下
package tsb.ws.common.authentication;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* 添加SoapHeader拦截器
* @author cyf
*
*/
public class AddSoapHeader extends AbstractSoapInterceptor {
public AddSoapHeader() {
super(Phase.WRITE);
}
/**
* 处理soap信息
* @param message soap信息
* <