前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CXF - 拦截器

CXF - 拦截器

作者头像
用户5927264
发布2019-07-31 10:08:37
1.3K0
发布2019-07-31 10:08:37
举报
文章被收录于专栏:OSChina
  1. 服务器端自定义拦截器
代码语言:javascript
复制
package org.shi.cxf;

import java.io.FileNotFoundException;
import java.io.PrintWriter;

import javax.xml.ws.Endpoint;

import org.apache.cxf.ext.logging.LoggingOutInterceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import org.shi.cxf.intecepter.AuthInteceptor;
import org.shi.cxf.ws.HelloWorld;
import org.shi.cxf.ws.QueryCatsByUser;
import org.shi.cxf.ws.impl.HelloWorldImpl;
import org.shi.cxf.ws.impl.QueryCatsByUserImpl;

/**
 * Web Service 服务器端  主启动类
 * @author xiaoshi
 *
 */
public class WSServiceStart {

	public static void main(String[] args) throws FileNotFoundException {
		//需要暴露的服务
		HelloWorld hw = new HelloWorldImpl();
		QueryCatsByUser queryCatsByUser = new QueryCatsByUserImpl();
		
		// 调用Endpoint 的 publish方法发布 Web Service 服务
		EndpointImpl ep =  (EndpointImpl) Endpoint.publish("http://127.0.0.1/shiWS", hw);
		
		//自定义拦截器用来来接用户名密码等的信息
		ep.getInInterceptors().add(new AuthInteceptor());
		
		System.out.println("web Service 发布成功!");
	}

}

拦截器的实现

代码语言:javascript
复制
package org.shi.cxf.intecepter;

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;

/**
 * 自定义拦截器实现用户名密码等的拦截
 * @author xiaoshi
 *
 */
public class AuthInteceptor extends AbstractPhaseInterceptor<SoapMessage>{

	public AuthInteceptor() {
		super(Phase.PRE_INVOKE);//该拦截器将会 在 “调用之前” 拦截SOAP 消息
	}

	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		System.out.println("------AuthInteceptor拦截到-----" + msg);
		
		List<Header> list =  msg.getHeaders();
		
		if(list == null || list.size()<1) {
			throw new Fault(new IllegalArgumentException("用户不合法,静止访问!"));
		}
		
		System.out.println(list.toString());
	}

}

然后用户访问的时候会被拦截到

2 .客户端自定义拦截器

代码语言:javascript
复制
package org.shi.cxf;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.shi.cxf.interceptor.AddHeaderInterceptor;
import org.shi.cxf.ws.HelloWorld;
import org.shi.cxf.ws.impl.HelloWorldServiceName;

/**
 * web service 客户端  启动方法
 * @author xiaoshi
 *
 */
public class WSClientStart {

	public static void main(String[] args) {
		HelloWorldServiceName servieFactory = new HelloWorldServiceName();
		
		//此处返回的只是远程Web Service的代理;
		HelloWorld hw = servieFactory.getHelloWorldImplPort();
		
		//自定义拦截器实现请求拦截(就是out拦截)
		Client client = ClientProxy.getClient(hw);
		client.getOutInterceptors().add(new AddHeaderInterceptor("shiye","123"));//设置消息头
		client.getOutInterceptors().add(new LoggingOutInterceptor());//打印消息请求
		
		System.out.println(hw.sayHi("施爷"));
	}

}
代码语言:javascript
复制
package org.shi.cxf.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 pwd;
	
	public AddHeaderInterceptor(String userName,String pwd) {
		super(Phase.PREPARE_SEND); //在准备发送时启用拦截器
		this.pwd = pwd;
		this.userName = userName;
	}

	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		List<Header> list = msg.getHeaders();
			
		//创建Document对象
		Document doc = DOMUtils.createDocument();
		Element element = doc.createElement("authHeader");
		
		//创建服务器端要求的参数类型格式
		Element idElement = doc.createElement("userName");
		idElement.setTextContent(userName);
		Element pwdElement = doc.createElement("pwd");
		pwdElement.setTextContent(pwd);
		
		element.appendChild(idElement);
		element.appendChild(pwdElement);
		
		Header header = new Header(new QName("auth"),element);
		list.add(header);//添加消息头
	}

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档