(三)CXFはInterceptorを用いてヘッダ情報を処理する

9766 ワード

CXFはInterceptorブロッキングチェーンを提供してSOAPメッセージをブロッキング処理する
ブロッキングは異なるPhaseに分けられ、各Phaseには独自のブロッキングチェーンがあり、http://cxf.apache.org/docs/interceptors.html参照
  (三)CXF使用Interceptor处理头信息_第1张图片  
クライアントにヘッダ情報を追加
ヘッダ情報は文字列です
interceptorの作成
PHASE:WRITE
package com.hqh.ws.cxf.interceptor;

import java.util.List;

import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.phase.Phase;

public class LicenseOutInterceptor extends AbstractSoapInterceptor{
	/**
	 *             
	 * @param p
	 */
	public LicenseOutInterceptor() {
		super(Phase.WRITE);
	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		List<Header> headers = message.getHeaders();
		try {
			//  QName
			String namespaceURI = "http://ws.cxf.hqh.com";
			String localPart = "license";
			String prefix = "ns";
			QName qname = new QName(namespaceURI, localPart, prefix);

			//      header       
			String sendObj = "license for webservice";
			
			//  DataBinding
			DataBinding dataBinding = new JAXBDataBinding(String.class);
			
			//  Header
			Header header = new Header(qname, sendObj, dataBinding);
			// header   SOAP    
			headers.add(header);
		} catch (JAXBException e) {
			e.printStackTrace();
			throw new Fault(e);
		}
		
	}

}

 
サービス呼び出し時にinterceptorに参加
/**
	 *   interceptor  header
	 */
	@Test
	public void test03() {
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(IMyService.class);
		factory.setAddress("http://localhost:8888/cxf/ws?wsdl");
		//       
		factory.getOutInterceptors().add(new LoggingOutInterceptor());
		//         
		factory.getOutInterceptors().add(new LicenseOutInterceptor());
		//      
		IMyService service = (IMyService)factory.create();
		//    
		String reply = service.sayHello("   ");
		
		System.out.println(reply);
		System.exit(0);
	}

 
 
 
ヘッダ情報はオブジェクトです
 
package com.hqh.ws.cxf.model;

public class User {
	private String name;
	private String pwd;
	
	
	public User() {
		super();
	}
	public User(String name, String pwd) {
		super();
		this.name = name;
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
}

 
package com.hqh.ws.cxf.interceptor;

import java.util.List;

import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.phase.Phase;

import com.hqh.ws.cxf.model.User;

public class LicenseOutInterceptor extends AbstractSoapInterceptor{
	/**
	 *             
	 * @param p
	 */
	public LicenseOutInterceptor() {
		super(Phase.WRITE);
	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		List<Header> headers = message.getHeaders();
		try {
			//  QName
			String namespaceURI = "http://ws.cxf.hqh.com";
			String localPart = "license";
			String prefix = "ns";
			QName qname = new QName(namespaceURI, localPart, prefix);

			//      header       
			//String sendObj = "license for webservice";
			
			//        
			User user = new User("admin","admin1");
			
			//  DataBinding
			//DataBinding dataBinding = new JAXBDataBinding(String.class);
			DataBinding dataBinding = new JAXBDataBinding(User.class);
			
			//  Header
			//Header header = new Header(qname, sendObj, dataBinding);
			Header header = new Header(qname, user, dataBinding);
			
			// header   SOAP    
			headers.add(header);
		} catch (JAXBException e) {
			e.printStackTrace();
			throw new Fault(e);
		}
		
	}

}

 
クライアントからのSOAPメッセージ
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Header>
		<ns:license xmlns:ns="http://ws.cxf.hqh.com">
			<name>admin</name>
			<pwd>admin1</pwd>
		</ns:license>
	</soap:Header>
	<soap:Body>
		<ns2:sayHello xmlns:ns2="http://cxf.ws.hqh.com/">
			<name>   </name>
		</ns2:sayHello>
	</soap:Body>
</soap:Envelope>

 
 
サービス側はブロックを使用してヘッダ情報を取得する
PHASE:UNMARSHALLER
package com.hqh.ws.cxf.interceptor;

import java.util.List;

import javax.xml.bind.JAXBException;
import javax.xml.soap.SOAPException;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;

import com.hqh.ws.cxf.model.User;

public class licenseInIntercptor extends AbstractSoapInterceptor{
	
	/**
	 *           
	 *        header     ,   UNMARSHAL  
	 *   :     READ  ,READ       xml  ,    message      header     
	 *  unmarshaller xml            ,   header        
	 * @param p
	 */
	public licenseInIntercptor() {
		super(Phase.UNMARSHAL);
	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		//     header
		List<Header> headers = message.getHeaders();
		System.out.println("headers size:"+headers.size());
		try {
			//      DataBinding          ? read/unmarshaller   ?
			//DataBinding binding = new JAXBDataBinding(User.class);
			for(Header head : headers) {
				String localPart = head.getName().getLocalPart();
				System.out.println("         :"+localPart);
				if("license".equals(localPart)) {
					//  cxf             
					Object obj = head.getObject();
                                        //  :      obj         User  !
					System.out.println(obj instanceof User);
					Element element = (Element)obj;
					String name = element.getElementsByTagName("name").item(0).getTextContent();
					String pwd = element.getElementsByTagName("pwd").item(0).getTextContent();
					if("admin".equals(name) && "admin".equals(pwd)) {
						System.out.println("    ");
					} else {
						SOAPException ex = new SOAPException("      !");
						throw new Fault(ex);
					}
				}
			}
		} catch (Exception e) {
			//e.printStackTrace();
			throw new Fault(e);
		}
	}

}

サービス側がサービスをパブリッシュするときに指定したブロッキングを追加
 
	/**
	 *   CXF    
	 */
	public static void startServerByCXF() {
		JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
		svrFactory.setServiceClass(IMyService.class);
		svrFactory.setAddress("http://localhost:8888/cxf/ws");
		svrFactory.setServiceBean(new MyServiceImpl());
		//       
		svrFactory.getInInterceptors().add(new LoggingInInterceptor());
		//       
		svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());
		
		/**
		 *       Handler           
		 */
//		List<Handler> handlers = new ArrayList<Handler>();
//		handlers.add(new LicenseHandler());
//		svrFactory.setHandlers(handlers);
		
		/**
		 *           
		 */
		svrFactory.getInInterceptors().add(new licenseInIntercptor());
		
		svrFactory.create();
	}