webservice之攔截器
阿新 • • 發佈:2018-07-10
trac stack hand name static actor 攔截 extend fault
記錄一次webservice添加攔截器,來達到修改xml報文的目的
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
private Soap createSoap() {
service = new Service();
soap = service.getServiceSoap();
//攔截器改造報文頭
client = ClientProxy.getClient(soap);
HeaderInInterceptor soapHeaderInInterceptor = new HeaderInInterceptor();
soapHeaderInInterceptor.setHostUser("username", "password");
client.getOutInterceptors().add(soapHeaderInInterceptor);
return soap;
}
public class HeaderInInterceptor extends AbstractSoapInterceptor {
public HeaderInInterceptor() {
super(Phase.WRITE);
}
private String msg;
@Override
public void handleMessage(SoapMessage message) throws Fault {
try {
List<Header> headers = message.getHeaders();
QName qName = new QName("Authorization-My-Header");//需要增加的節點
Document document = careteDocument(msg);
Element documentElement = document.getDocumentElement();
SoapHeader head = new SoapHeader(qName, documentElement);
headers.add(head);
} catch (Exception e) {
e.printStackTrace();
}
}
public void setHostUser(String username,String pw) {
String str = "<tem:AuthorizationSoapHeader soapenv:mustUnderstand=\"1\" xmlns:tem=\"http://tempuri.org/\" "
+ "xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
+ "\t<tem:UserName>"+ username+"</tem:UserName>\n"
+ "\t<tem:Password>"+pw+"</tem:Password>\n"
+ "</tem:AuthorizationSoapHeader>";
this.msg = str;
}
public static Document careteDocument(String xml) throws Exception {
InputStream strm ;
strm = new ByteArrayInputStream(xml.getBytes("UTF-8"));
DocumentBuilderFactory domFactory = DocumentBuilderFactory
.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(strm);
return doc;
}
}
ps:一般來說,使用 “wsimport -clientjar {xxx.jar} -p {包名} -s {源碼包名} {url}” 生成的客戶端中,創建service都有無參和有參的方法
無參:每次去調用遠端的URL來生成service
有參:將wsdl放在本地,通過url傳入該方法,即可減少每次請求的網絡開銷
service = new Service(new URL("file://xxx/xxx.wsdl"));
webservice之攔截器