一、新建两个maven java工程,分别为ws_server 和 ws_client。
二、引用的jar包 是maven工程,pom.xml 文件内容如下:
<properties>
<cxf.version>3.1.10</cxf.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- hello.jar 只在客戶端引用 -->
<dependency>
<groupId>my</groupId>
<artifactId>study</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/lib/hello.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-bindings-soap</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.codehaus.woodstox/stax2-api -->
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>stax2-api</artifactId>
<version>4.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.29</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
三、ws_server代码
3.1 Hello.java 接口
package com.ws_server;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface Hello {
@WebMethod
public String sayHello(String userName);
@WebMethod
public List<User> getAllUser();
@WebMethod
public Map<Integer,User> getMapUser(int id);
@WebMethod
public Set<User> getSetUser(float age);
@WebMethod
public String getJsonUser();
}
3.2 HelloImpl.java 接口实现
package com.ws_server;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jws.WebService;
import com.alibaba.fastjson.JSONObject;
@WebService
public class HelloImpl implements Hello {
static List<User> users = new ArrayList<User>();
static {
User user1 = new User(1, "张三", 12.0f);
User user2 = new User(2, "李四", 13.0f);
User user3 = new User(3, "王五", 14.0f);
User user4 = new User(4, "赵六", 15.0f);
User user5 = new User(5, "董七", 16.0f);
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
users.add(user5);
}
public String sayHello(String userName) {
System.out.println("-----server-----sayHello------"+userName);
return "server-------return------"+userName;
}
public List<User> getAllUser() {
System.out.println("-----server------getAllUser---------");
return HelloImpl.users;
}
public Map<Integer, User> getMapUser(int id) {
System.out.println("-----server------getMapUser---------"+id);
Map<Integer, User> map = new HashMap<Integer, User>();
for(int i=0; i<HelloImpl.users.size(); i++){
if(id == users.get(i).getId()){
map.put(id, users.get(i));
}
}
return map;
}
public Set<User> getSetUser(float age) {
System.out.println("-----server------getSetUser---------"+age);
Set<User> set = new HashSet<User>();
for(int i=0; i<HelloImpl.users.size(); i++){
if(users.get(i).getAge() > age){
set.add(users.get(i));
}
}
return set;
}
public String getJsonUser() {
System.out.println("-----server------getJsonUser---------");
JSONObject jsonObject = new JSONObject();
jsonObject.put("user", users);
return jsonObject.toString();
}
}
3.3 HelloServer.java 发布服务
package com.ws_server;
import javax.xml.ws.Endpoint;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
public class HelloServer {
public static void main(String[] args) {
//endpoint 发布方式
Hello hello = new HelloImpl();
String address = "http://109.52.60.41:8080/hello";
//Endpoint.publish(address, hello);
//cxf发布方式
JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
factoryBean.setAddress(address);
factoryBean.setServiceClass(HelloImpl.class);
factoryBean.setServiceBean(hello);
//服务端出 和 入的日志拦截器 打印日志
factoryBean.getInInterceptors().add(new LoggingInInterceptor());
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
//添加自定义拦截器
factoryBean.getInInterceptors().add(new MyInterceptor());
Server server = factoryBean.create();
server.start();
System.out.println("server start");
}
}
3.4 MyInterceptor.java 自定义拦截器 服务端
package com.ws_server;
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 {
System.out.println("------MyInterceptor------");
List<Header> headers = message.getHeaders();
if(headers == null || headers.size() < 1){
throw new Fault(new IllegalArgumentException("-----验证未通过-----"));
}
Header header = headers.get(0);
Element element = (Element) header.getObject();
NodeList userTemp = element.getElementsByTagName("userName");
NodeList passwordTemp = element.getElementsByTagName("password");
String user = userTemp.item(0).getTextContent();
String password = passwordTemp.item(0).getTextContent();
System.out.println("--------user------"+user);
System.out.println("--------password------"+password);
if(!user.equals("zhangsan") || user == null){
throw new Fault(new IllegalArgumentException("-----用户名未通过验证-----"));
}
if(!password.equals("123456") || password == null){
throw new Fault(new IllegalArgumentException("-----密码未通过验证-----"));
}
System.out.println("-------正常-------");
}
}
3.5 User.java POJO类
package com.ws_server;
public class User {
private int id;
private String name;
private float age;
public User(){
}
public User(int id, String name, float age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getAge() {
return age;
}
public void setAge(float age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
4.ws_client 客户端
将ws_server 服务端的Hello.java和User.java导出为一个hello.jar包,放到ws_client端的src/lib/目录下,在pom.xml文件中配置。
4.1 HelloClient.java
package com.ws_client;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.alibaba.fastjson.JSONObject;
import com.ws_server.Hello;
public class HelloClient {
public static void main(String[] args) {
System.out.println("------client----");
String address = "http://109.52.60.41:8080/hello";
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
factoryBean.setAddress(address);
factoryBean.setServiceClass(Hello.class);
//客户端打印日志
factoryBean.getInInterceptors().add(new LoggingInInterceptor());
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
//客户端拦截器
factoryBean.getOutInterceptors().add(new MyClientInterceptor());
Hello hello = (Hello) factoryBean.create();
System.out.println("----client-------sayHello-------");
System.out.println(hello.sayHello("world"));
System.out.println("----client-------getAllUser-------");
System.out.println(hello.getAllUser());
System.out.println("----client-------getMapUser-------");
System.out.println(hello.getMapUser(3));
System.out.println("----client-------getSetUser-------");
System.out.println(hello.getSetUser(13.0f));
System.out.println("----client-------getJsonUser-------");
JSONObject jsonObject = JSONObject.parseObject(hello.getJsonUser());
System.out.println(jsonObject.get("user"));
}
}
4.2 MyClientInterceptor.java
package com.ws_client;
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 MyClientInterceptor extends AbstractPhaseInterceptor<SoapMessage>{
private String userName;
private String password;
//准备发送时调用
public MyClientInterceptor() {
super(Phase.PREPARE_SEND);
userName = "zhangsan";
password = "123456";
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
List<Header> headers = message.getHeaders();
/*
* <soap:Header>
* <authrity>
* <userName>zhangsan</userName>
* <password>123456</password>
* </authrity>
* </soap:Header>
*/
Document document = DOMUtils.createDocument();
Element auth = document.createElement("authrity");
Element userName = document.createElement("userName");
userName.setTextContent(this.userName);
Element password = document.createElement("password");
password.setTextContent(this.password);
auth.appendChild(userName);
auth.appendChild(password);
headers.add(0, new Header(new QName("myClient"), auth));
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}