1.server端main方法
package com.java1234.webservice.impl;
import javax.xml.ws.Endpoint;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import com.java1234.interceptor.MyInterceptor;
import com.java1234.webservice.HelloWorld;
public class Server {
public static void main(String[] args) {
System.out.println("web service start");
HelloWorld implementor=new HelloWorldImpl();
String address="http://192.168.244.1/helloWorld";
// Endpoint.publish(address, implementor); // jdk实现 暴露webservice接口
JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
factoryBean.setAddress(address); // 设置暴露地址
factoryBean.setServiceClass(HelloWorld.class); // 接口类
factoryBean.setServiceBean(implementor); // 设置实现类
factoryBean.getInInterceptors().add(new LoggingInInterceptor());//添加in拦截器,
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());//添加out的拦截器
/*
* 自定义拦截器, 权限认证
*/
factoryBean.getInInterceptors().add(new MyInterceptor());
factoryBean.create(); // 创建webservice接口
System.out.println("web service started");
}
}
拦截器的实现
package com.java1234.interceptor;
import java.util.List;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.common.security.UsernameToken;
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 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(uList.getLength()!=1){
throw new Fault(new IllegalArgumentException("密码格式不对!"));
}
String username=uList.item(0).getTextContent();
String password=pList.item(0).getTextContent();
if(!username.equals("java1234") || !password.equals("123456") ){
throw new Fault(new IllegalArgumentException("用户密码错误!"));
}
}
}
2.客户端 main方法
package com.java1234.webservice;
import java.util.List;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import com.java1234.interceptor.AddHeaderInterceptor;
public class Client {
public static void main(String[] args) {
HelloWorldService service=new HelloWorldService();
HelloWorld helloWorld=service.getHelloWorldPort();
org.apache.cxf.endpoint.Client client= ClientProxy.getClient(helloWorld);
client.getOutInterceptors().add(new AddHeaderInterceptor("java1234","123456")); // 添加自定义拦截器
client.getInInterceptors().add(new LoggingInInterceptor());//添加
client.getOutInterceptors().add(new LoggingOutInterceptor());
/*
*数据只能传输List<T>,不能传输map,所以map的key放入T中,便可以轻松传输!
*/
MyRoleArray arry = helloWorld.getRoles();
List<MyRole> roleList= arry.item;
for(int i=0; i<roleList.size();i++){
MyRole my=roleList.get(i);
System.out.println(my.key+":");
for(Role r:my.value){
System.out.println(r.getId()+","+r.getRoleName());
}
System.out.println("========================");
}
}
}
拦截器的实现:
package com.java1234.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);
// aaa_QName 暂时可以自定义
headerList.add(new Header(new QName("aaa_QName"),ele));
}
}
控制台:显示
client |
|
server |
|