基于CXF webservice(3)高级属性之拦截器(interceptor)

webservice中用来对消息进行填充,验证,等预处理的高级特性。个人感觉比较重要,实用价值比较高。

需要直接或间接继承的

public interface Interceptor<T extends Message> {


    void handleMessage(T message) throws Fault;
    
    void handleFault(T message);

}

以及它的子接口

public interface PhaseInterceptor<T extends Message> extends Interceptor<T> {

    Set<String> getAfter();

    Set<String> getBefore();

    String getId();

    String getPhase();
    
    Collection<PhaseInterceptor<? extends Message>> getAdditionalInterceptors();

}

下面来看看他们的树结构:


下面我们来编写我们的客户端,

还是接着上面提到的例子上完成拦截器的功能


OrderProcessUserCredentialInterceptor.java

package demo.order;

import javax.xml.namespace.QName;

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.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class OrderProcessUserCredentialInterceptor extends
		AbstractSoapInterceptor {

	private String userName;
	private String password;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public OrderProcessUserCredentialInterceptor() {
		super(Phase.PRE_INVOKE);
	}

	public OrderProcessUserCredentialInterceptor(String p) {
		super(p);
	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {

		System.out.println("OrderProcessUserCredentialInterceptor");
	
		QName qnameCredentials = new QName("OrderCredentials");
		if (message.hasHeader(qnameCredentials)) {
			Header header = message.getHeader(qnameCredentials);
			Element elementOrderCredential = (Element) header.getObject();
			Node nodeUser = elementOrderCredential.getFirstChild();
			Node nodePassword = elementOrderCredential.getLastChild();
			if (nodeUser != null) {
				userName = nodeUser.getTextContent();
			}
			if (nodePassword != null) {
				password = nodePassword.getTextContent();
			}
		}
		System.out
				.println("userName reterived from soap header is " + userName);
		System.out
				.println("password reterived from soap header is " + password);
		if ("tianjun".equalsIgnoreCase(userName)
				&& "123".equalsIgnoreCase(password)) {
			System.out.println("tianjun:123");
		}else{
			throw new RuntimeException("invalid user&&验证非法!!!");
		}

	}

}

同时在服务器端的OrderProcessImpl.java上配置入拦截器如下所示:


启动服务端即可

--------------------------------------------------------------------

---------------------------------------------------------------------

客户端:

如上上图所示添加OrderProcessClientHandler.java

package demo.order.client;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class OrderProcessClientHandler extends AbstractSoapInterceptor {

	private String userName;
	private String password;
	
	

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public OrderProcessClientHandler() {
		super(Phase.WRITE);
		this.addAfter(SoapPreProtocolOutInterceptor.class.getName());
	}

	public void handleMessage(SoapMessage message) throws Fault {
		
		System.out.println("orderprocessClientHandler handleMessage invoked");
		DocumentBuilder builder = null;
		try{
			builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			
		}catch(ParserConfigurationException e){
			e.printStackTrace();
		}
		Document doc = builder.newDocument();
		Element elementCredentials = doc.createElement("OrderCredentials");
		
		Element elementUser = doc.createElement("username");
		elementUser.setTextContent(getUserName());
		
		Element elementPassword = doc.createElement("password");
		elementPassword.setTextContent(getPassword());
		
		elementCredentials.appendChild(elementUser);
		elementCredentials.appendChild(elementPassword);
		
		QName qnameCredentials = new QName("OrderCredentials");
		Header header = new Header(qnameCredentials, elementCredentials);
		message.getHeaders().add(header);
//		System.out.println(((Element)message.getHeader(qnameCredentials).getObject()).getFirstChild().getTextContent());
//		System.out.println(((Element)message.getHeader(qnameCredentials).getObject()).getLastChild().getTextContent());
		
	}

}

在服务器端配置出拦截器如下:


如上即可通过验证。本次就完成了一个简单拦截器的验证功能,其实就是添加如下所示的message头的验证:





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值