对于负责的数据类型,即自己定义的javabean,必须要有无参构造方法,当服务端传递的map时,客户端要用一个List<Entry>遍历map,例如
注意jdk不支持map的结构
最顶层有个拦截器的接口
写拦截器的代码:
package com.java_webservice.day01_ws.server;
import java.util.List;
import javax.xml.ws.Endpoint;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.message.Message;
import com.java_webservice.day01_ws.HelloWSImpl;
public class ServerTest3 {
public static void main(String[] args) {
String address = "http://127.0.0.1:8888/day01_ws/datatypews";
Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl());
System.out.println(endpoint);
EndpointImpl endpointImpl = (EndpointImpl)endpoint;
//服务端的日志入拦截器
List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors();
inInterceptors.add(new LoggingInInterceptor()); //得到对应的拦截器
//服务器端的日志出拦截器
List<Interceptor<? extends Message>> outInterceptors = endpointImpl.getOutInterceptors();
outInterceptors.add(new LoggingOutInterceptor());
System.out.println("发布成功");
}
}
给客户端增加拦截器,拦截器是cxf框架的所以,需要导入jar包
package com.java_webservice.day01_ws.test;
import java.util.List;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;
import com.java_webservice.day01_ws.HelloWS;
import com.java_webservice.day01_ws.HelloWSImplService;
public class client {
public static void main(String[] args) {
HelloWSImplService facory = new HelloWSImplService();
HelloWS hellows = facory.getHelloWSImplPort();
Client client = ClientProxy.getClient(hellows);
//获取出日志出拦截器
List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
outInterceptors.add(new LoggingOutInterceptor());
//获取客户端日志入拦截器
List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();
inInterceptors.add(new LoggingInInterceptor());
String result = hellows.sayHello("Bob");
System.out.print("client"+ result);
}
}
自定义拦截器,有的时候别人调用我们的webservice,我需要验证是否是合法的用户,我们要得调用的用户名和密码:
我们需要将代用户信息方法xml片段中
下面是cxf 客户端的一个拦截器,即自顶一个客户端输出的拦截器
package com.java_webservice.day01_ws.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.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.sun.org.apache.xml.internal.utils.DOMHelper;
public class AddUserinterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private String name;
private String password;
public AddUserinterceptor(String name, String password) {
super(Phase.PRE_PROTOCOL);//准备协议化的时候进行拦截
this.name = name;
this.password = password;
}
/**
* 请求的内容都是html+xml的格式,我们需要将用户信息方法xml片段中
* 所以我们需要将信息中的头信息添加进去
* 根据以前拦截的信息,我们分析出xml标签片段有
* <Envelope>
* <Body>
* <sayHellow></sayHellow>
* </Body>
* </Envelope>
*
*
*/
@Override
public void handleMessage(SoapMessage msg) throws Fault {
List<Header> headers = msg.getHeaders();
Document createDocument = DOMHelper.createDocument();
Element rootEle = createDocument.createElement("atguigu");
//创建name标签,并且将name标签放到对应的
Element nameEle = createDocument.createElement("name");
nameEle.setTextContent(name);
rootEle.appendChild(nameEle);
//我们创建password标签
Element padEle = createDocument.createElement("password");
padEle.setTextContent(password);
rootEle.appendChild(padEle);
headers.add(new Header(new QName("atguigu"), rootEle));
System.out.println("client handleMessage");
}
}
客户端调用我们的拦截器器代码
package com.java_webservice.day01_ws.test;
import java.util.List;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;
import com.java_webservice.day01_ws.HelloWS;
import com.java_webservice.day01_ws.HelloWSImplService;
import com.java_webservice.day01_ws.interceptor.AddUserinterceptor;
public class Testclient3 {
public static void main(String[] args) {
HelloWSImplService facory = new HelloWSImplService();
HelloWS hellows = facory.getHelloWSImplPort();
Client client = ClientProxy.getClient(hellows);
//获取出日志出拦截器
List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
outInterceptors.add(new LoggingOutInterceptor());
//获取客户端日志入拦截器
List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();
//将我们自定义的拦截器类放到 客户端的拦截器集合中
outInterceptors.add(new AddUserinterceptor("abc", "123456"));
String result = hellows.sayHello("Bob");
System.out.print("client"+ result);
}
}
然后启动服务端你和客户端,我们发现服务端的拦截器 有我们自定义的片段
同理下面写一个服务端的输入拦截器
package com.java_webservice.day01_ws.interceptor;
import javax.xml.namespace.QName;
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;
public class CheckInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
public CheckInterceptor() {
super(Phase.PRE_PROTOCOL); //在协议化的时候传递
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
Header header = message.getHeader(new QName("atguigu"));
if(header != null ) {
Element atguiguEle = (Element)header.getObject();
String name = atguiguEle.getElementsByTagName("name").item(0).getTextContent();
String password = atguiguEle.getElementsByTagName("password").item(0).getTextContent();
if("abc".equals(name) && "123456".equals(password)) {
System.out.println("server 通过拦截器");
}else {
//不能通过,我们抛出一个一场,实际开发中不能这样做
System.out.println("server 不通过");
throw new Fault(new RuntimeException("请求需要一个正确的用户名和密码"));
}
}
}
}
修改服务端的代码
package com.java_webservice.day01_ws.server;
import java.util.List;
import javax.xml.ws.Endpoint;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.message.Message;
import com.java_webservice.day01_ws.HelloWSImpl;
import com.java_webservice.day01_ws.interceptor.CheckInterceptor;
public class ServerTest3 {
public static void main(String[] args) {
String address = "http://127.0.0.1:8888/day01_ws/datatypews";
Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl());
System.out.println(endpoint);
EndpointImpl endpointImpl = (EndpointImpl)endpoint;
//服务端的日志入拦截器
List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors();
inInterceptors.add(new CheckInterceptor()); //得到对应的拦截器
//服务器端的日志出拦截器
List<Interceptor<? extends Message>> outInterceptors = endpointImpl.getOutInterceptors();
outInterceptors.add(new LoggingOutInterceptor());
System.out.println("发布成功");
}
}