java1234 webservice 第5 課 自定義攔截器

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("用戶密碼錯誤!"));
		 }
		
		
	}

}

 

2.客戶端 main方法

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>
--------------------------------------
相關文章
相關標籤/搜索