CXF自定义拦截器

1人阅读 评论(0) 收藏 举报
分类:

服务器端:

main:

public static void main(String[] args) {
		System.out.println("start");
		
		HelloWorld implementor=new HelloWorldImpl();
		String address="http://192.168.77.1:8121/helloWorld";
		JaxWsServerFactoryBean jaxWsServerFactoryBean=new JaxWsServerFactoryBean();
		jaxWsServerFactoryBean.setAddress(address);
		jaxWsServerFactoryBean.setServiceBean(implementor);
		jaxWsServerFactoryBean.setServiceClass(HelloWorld.class);
		jaxWsServerFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
		jaxWsServerFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
		
		jaxWsServerFactoryBean.getInInterceptors().add(new MyInterceptor());
		
		jaxWsServerFactoryBean.create();
		System.out.println("started");

Interceptor:

import java.util.List;
import org.apache.cxf.binding.soap.SoapMessage;
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,拦截器实施拦截"));
		}
		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(pList.getLength()!=1){
			throw new Fault(new IllegalArgumentException("密码格式不对"));
		}
		String userName=uList.item(0).getTextContent();
		String password=pList.item(0).getTextContent();
		
		if(!userName.equals("yefan")||!password.equals("123456")){
			throw new Fault(new IllegalArgumentException("用户名或者密码错误!"));
		}
	}

}

客户端调用:

main:

                org.apache.cxf.endpoint.Client client=ClientProxy.getClient(helloWorld);
		client.getOutInterceptors().add(new AddHeaderInterceptor("yefan","123456")); // 添加自定义拦截器
		client.getInInterceptors().add(new LoggingInInterceptor()); // 添加In拦截器 日志拦截器
		client.getOutInterceptors().add(new LoggingOutInterceptor()); // 添加Out拦截器 日志拦截器

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);
		
		headerList.add(new Header(new QName("yefan"),ele));
	}
	
}

SOAP:

<soap:Header><authHeader>
<userName>yefan</userName><password>123456</password>
</authHeader></soap:Header>
<soap:Body><ns2:getRoles xmlns:ns2="http://service.yefan.com/"/></soap:Body>
</soap:Envelope>

查看评论

如何在DLL中创建窗体(对话框和SDI/MDI)

    这是一个老问题了。我对此简单地写了一个小结,有不足之处,还请指出,谢 谢。      调用DLL中的Dlg或SDI/MDI, 只是不能再使用APP类了,因为它是从CWinThread继承过来,...
  • Brierbird
  • Brierbird
  • 2002-05-13 09:33:00
  • 996

使用CXF为Web Service添加拦截器,自定义拦截器

拦截器分为Service端和Client端      拦截器是在发送soap消息包的某一个时机拦截soap消息包,对soap消息包的数据进行分析或处理。分为CXF自带的拦截器和自定义的拦截器   ...
  • a9529lty
  • a9529lty
  • 2012-12-26 10:08:00
  • 7186

【WebService】CXF拦截器的设置以及自定义CXF拦截器

CXF的拦截器和以前学过的servlet的拦截器类似的,都是在开始或结束切入一段代码,执行一些逻辑之类的。我们可以在调用ws服务前设置拦截器,也可以在调用ws服务后设置拦截器,当然了,拦截器也可以添加...
  • eson_15
  • eson_15
  • 2016-07-31 20:29:22
  • 6289

CXF使用WSS4J实现WS-Security规范之使用用户名令牌

CXF使用WSS4J实现WS-Security规范之使用用户名令牌 , 这里主要讲述如何使用用户名令牌进行验证的实例!...
  • fhd001
  • fhd001
  • 2010-09-05 11:44:00
  • 5067

CXF自定义拦截器实现权限控制

一. 拦截器 在我们学习Java的征途中碰到了很多拦截器: Servlet中的Filter就是一个拦截器, Struts2中也有拦截器,. CXF中的拦截器其基本原理还是使用动态代理, 我们可以在不对...
  • zdp072
  • zdp072
  • 2014-06-08 00:20:04
  • 3430

CXF实战之自定义拦截器(五)

CXF已经内置了一些拦截器,这些拦截器大部分默认添加到拦截器链中,有些拦截器也可以手动添加,如手动添加CXF提供的日志拦截器。也可以自定义拦截器,CXF中实现自定义拦截器很简单,只要继承Abstrac...
  • accountwcx
  • accountwcx
  • 2015-07-30 11:47:16
  • 5288

11.为CXF客户端添加自定义拦截器完成权限控制

  • 2013年09月22日 13:45
  • 5.96MB
  • 下载

10.为CXF服务器端添加自定义拦截器进行权限检查

  • 2013年09月22日 13:21
  • 11.04MB
  • 下载

CXF利用过滤器实现身份验证

编写服务器端用户验证WsAuthHandler.java类 package Interceptor; import java.io.IOException; import javax.secur...
  • wangnetkang
  • wangnetkang
  • 2012-08-01 19:14:48
  • 5913

CXF拦截器Interceptor实现自定义消息,并以json格式返回

一、在拦截器中组装要返回的自定义消息 //组装返回自定义信息类resHeader.setRetCode(RetCode.IP_ERROR); resHeader.setRetMessage("非准入I...
  • shaoshiyang
  • shaoshiyang
  • 2017-11-22 15:00:00
  • 391
    个人资料
    持之以恒
    等级:
    访问量: 548
    积分: 286
    排名: 27万+
    文章存档