1.server端main方法java
package com.java1234.webservice.impl; import javax.xml.ws.Endpoint; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import com.java1234.interceptor.MyInterceptor; import com.java1234.webservice.HelloWorld; public class Server { public static void main(String[] args) { System.out.println("web service start"); HelloWorld implementor=new HelloWorldImpl(); String address="http://192.168.244.1/helloWorld"; // Endpoint.publish(address, implementor); // jdk實現 暴露webservice接口 JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean(); factoryBean.setAddress(address); // 設置暴露地址 factoryBean.setServiceClass(HelloWorld.class); // 接口類 factoryBean.setServiceBean(implementor); // 設置實現類 factoryBean.getInInterceptors().add(new LoggingInInterceptor());//添加in攔截器, factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());//添加out的攔截器 /* * 自定義攔截器, 權限認證 */ factoryBean.getInInterceptors().add(new MyInterceptor()); factoryBean.create(); // 建立webservice接口 System.out.println("web service started"); } }
攔截器的實現程序員
package com.java1234.interceptor; import java.util.List; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.common.security.UsernameToken; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public class MyInterceptor extends AbstractPhaseInterceptor<SoapMessage> { public MyInterceptor() { super(Phase.PRE_INVOKE); //在調用方法以前,調用自定義攔截器 } public void handleMessage(SoapMessage message) throws Fault { List<Header> headers = message.getHeaders(); if(headers==null && headers.size()==0){ throw new Fault(new IllegalArgumentException("沒有頭,拋出異常")); } Header firstHeader = headers.get(0); Element ele=(Element ) firstHeader.getObject(); NodeList uList= ele.getElementsByTagName("userName"); NodeList pList= ele.getElementsByTagName("password"); if(uList.getLength()!=1){ throw new Fault(new IllegalArgumentException("用戶名格式不對!")); } if(uList.getLength()!=1){ throw new Fault(new IllegalArgumentException("密碼格式不對!")); } String username=uList.item(0).getTextContent(); String password=pList.item(0).getTextContent(); if(!username.equals("java1234") || !password.equals("123456") ){ throw new Fault(new IllegalArgumentException("用戶密碼錯誤!")); } } }
package com.java1234.webservice; import java.util.List; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import com.java1234.interceptor.AddHeaderInterceptor; public class Client { public static void main(String[] args) { HelloWorldService service=new HelloWorldService(); HelloWorld helloWorld=service.getHelloWorldPort(); org.apache.cxf.endpoint.Client client= ClientProxy.getClient(helloWorld); client.getOutInterceptors().add(new AddHeaderInterceptor("java1234","123456")); // 添加自定義攔截器 client.getInInterceptors().add(new LoggingInInterceptor());//添加 client.getOutInterceptors().add(new LoggingOutInterceptor()); /* *數據只能傳輸List<T>,不能傳輸map,因此map的key放入T中,即可以輕鬆傳輸! */ MyRoleArray arry = helloWorld.getRoles(); List<MyRole> roleList= arry.item; for(int i=0; i<roleList.size();i++){ MyRole my=roleList.get(i); System.out.println(my.key+":"); for(Role r:my.value){ System.out.println(r.getId()+","+r.getRoleName()); } System.out.println("========================"); } } }
攔截器的實現:web
package com.java1234.interceptor; import java.util.List; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Document; import org.w3c.dom.Element; public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String userName; private String password; public AddHeaderInterceptor(String userName,String password) { super(Phase.PREPARE_SEND); // 準備發送SOAP消息的時候調用攔截器 this.userName=userName; this.password=password; } public void handleMessage(SoapMessage message) throws Fault { List<Header> headerList=message.getHeaders(); Document doc=DOMUtils.createDocument(); //建立做者節點 Element ele=doc.createElement("authHeader"); //建立一個節點 Element uElement=doc.createElement("userName"); uElement.setTextContent(userName); Element pElement=doc.createElement("password"); pElement.setTextContent(password); ele.appendChild(uElement); ele.appendChild(pElement); ////////////////// aaa_QName 暫時能夠自定義 headerList.add(new Header(new QName("aaa_QName"),ele)); } }
控制檯:顯示apache
client |
八月 02, 2016 1:52:55 下午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL 信息: Creating Service {http://webservice.java1234.com/}HelloWorldService from WSDL: http://192.168.244.1/helloWorld?wsdl 八月 02, 2016 1:52:56 下午 org.apache.cxf.services.HelloWorldService.HelloWorldPort.HelloWorld 信息: Outbound Message --------------------------- ID: 1 Address: http://192.168.244.1/helloWorld Encoding: UTF-8 Http-Method: POST Content-Type: text/xml Headers: {Accept=[*/*], SOAPAction=[""]} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><authHeader><userName>java1234</userName><password>123456</password></authHeader></soap:Header><soap:Body><ns2:getRoles xmlns:ns2="http://webservice.java1234.com/"/></soap:Body></soap:Envelope> -------------------------------------- 八月 02, 2016 1:52:56 下午 org.apache.cxf.services.HelloWorldService.HelloWorldPort.HelloWorld 信息: Inbound Message ---------------------------- ID: 1 Response-Code: 200 Encoding: UTF-8 Content-Type: text/xml; charset=UTF-8 Headers: {content-type=[text/xml; charset=UTF-8], Date=[Tue, 02 Aug 2016 05:52:56 GMT], Server=[Jetty(9.2.11.v20150529)], transfer-encoding=[chunked]} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getRolesResponse xmlns:ns2="http://webservice.java1234.com/"><return><item><key>jack</key><value><id>3</id><roleName>程序員</roleName></value></item><item><key>java1234</key><value><id>1</id><roleName>技術總監</roleName></value><value><id>2</id><roleName>架構師</roleName></value></item></return></ns2:getRolesResponse></soap:Body></soap:Envelope> -------------------------------------- jack: 3,程序員 ======================== java1234: 1,技術總監 2,架構師 ========================
|
server |
八月 02, 2016 2:02:03 下午 org.apache.cxf.services.HelloWorldService.HelloWorldPort.HelloWorld 信息: Inbound Message ---------------------------- ID: 9 Address: http://192.168.244.1/helloWorld?wsdl Http-Method: GET Content-Type: text/xml Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], content-type=[text/xml], Host=[192.168.244.1], Pragma=[no-cache], User-Agent=[Apache CXF 3.1.5]} -------------------------------------- 八月 02, 2016 2:02:04 下午 org.apache.cxf.services.HelloWorldService.HelloWorldPort.HelloWorld 信息: Inbound Message ---------------------------- ID: 10 Address: http://192.168.244.1/helloWorld Encoding: UTF-8 Http-Method: POST Content-Type: text/xml; charset=UTF-8 Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[276], content-type=[text/xml; charset=UTF-8], Host=[192.168.244.1], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 3.1.5]} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><authHeader><userName>java1234</userName><password>123456</password></authHeader></soap:Header><soap:Body><ns2:getRoles xmlns:ns2="http://webservice.java1234.com/"/></soap:Body></soap:Envelope> -------------------------------------- 傳入的信息是message:{javax.xml.ws.wsdl.port={http://webservice.java1234.com/}HelloWorldPort, org.apache.cxf.service.model.MessageInfo=[MessageInfo INPUT: {http://webservice.java1234.com/}getRoles], org.apache.cxf.message.Message.PROTOCOL_HEADERS={Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[276], content-type=[text/xml; charset=UTF-8], Host=[192.168.244.1], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 3.1.5]}, org.apache.cxf.interceptor.LoggingMessage.ID=10, HTTP_CONTEXT_MATCH_STRATEGY=stem, http.service.redirection=null, org.apache.cxf.request.url=http://192.168.244.1/helloWorld, javax.xml.ws.wsdl.interface={http://webservice.java1234.com/}HelloWorld, org.apache.cxf.request.uri=/helloWorld, HTTP.REQUEST=(POST /helloWorld)@8729297 org.eclipse.jetty.server.Request@8532d1, org.apache.cxf.transport.https.CertConstraints=null, HTTP.CONFIG=null, Accept=*/*, org.apache.cxf.headers.Header.list=[org.apache.cxf.binding.soap.SoapHeader@cb68d8], org.apache.cxf.message.Message.BASE_PATH=/helloWorld, org.apache.cxf.message.Message.PATH_INFO=/helloWorld, schema-validation-enabled=NONE, org.apache.cxf.continuations.ContinuationProvider=org.apache.cxf.transport.http_jetty.continuations.JettyContinuationProvider@50623e, javax.xml.ws.wsdl.service={http://webservice.java1234.com/}HelloWorldService, org.apache.cxf.message.Message.IN_INTERCEPTORS=[org.apache.cxf.transport.https.CertConstraintsInterceptor@101e5eb], org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@19dc697, org.apache.cxf.message.Message.ENCODING=UTF-8, org.apache.cxf.message.Message.QUERY_STRING=null, HTTP.RESPONSE=HTTP/1.1 200 Date: Tue, 02 Aug 2016 06:02:04 GMT , org.apache.cxf.security.SecurityContext=org.apache.cxf.transport.http.AbstractHTTPDestination$2@161e60b, org.apache.cxf.configuration.security.AuthorizationPolicy=null, org.apache.cxf.async.post.response.dispatch=true, org.apache.cxf.request.method=POST, javax.xml.ws.wsdl.operation={http://webservice.java1234.com/}getRoles, org.apache.cxf.transport.Destination=org.apache.cxf.transport.http_jetty.JettyHTTPDestination@2bbfbc, org.apache.cxf.message.MessageFIXED_PARAMETER_ORDER=false, javax.xml.ws.wsdl.description=http://192.168.244.1:80/helloWorld?wsdl, http.base.path=http://192.168.244.1, org.apache.cxf.service.model.BindingMessageInfo=org.apache.cxf.service.model.BindingMessageInfo@38e338, HTTP.CONTEXT=ServletContext@o.e.j.s.h.ContextHandler@1dc0fec{/,null,AVAILABLE}, Content-Type=text/xml; charset=UTF-8} 八月 02, 2016 2:02:04 下午 org.apache.cxf.services.HelloWorldService.HelloWorldPort.HelloWorld 信息: Outbound Message --------------------------- ID: 10 Response-Code: 200 Encoding: UTF-8 Content-Type: text/xml Headers: {} Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getRolesResponse xmlns:ns2="http://webservice.java1234.com/"><return><item><key>jack</key><value><id>3</id><roleName>程序員</roleName></value></item><item><key>java1234</key><value><id>1</id><roleName>技術總監</roleName></value><value><id>2</id><roleName>架構師</roleName></value></item></return></ns2:getRolesResponse></soap:Body></soap:Envelope> -------------------------------------- |