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 发布成功!");
}
}
拦截器的实现
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 .客户端自定义拦截器
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("施爷"));
}
}
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);//添加消息头
}
}