一、新建两个maven java工程,分别为ws_server 和 ws_client。 二、引用的jar包 是maven工程,pom.xml 文件内容如下: propertiescxf.version3.1.10/cxf.versionproject.build.sourceEncodingUTF-8/project.build.sourceEncod
一、新建两个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; } }