/**
* @文件名称: Order.java
* @描述: TODO
* @作者: 一叶扁舟(skiff)
* @时间:2017年2月23日 上午9:47:35
* @版本:V1.0
*/
package www.skiff.cn.webservice.domain;
/**
* @类功能说明:
* @作者: 一叶扁舟 (skiff)
* @创建时间:2017年2月23日 上午9:47:35
* @版本:V1.0
*/
public class Order {
private Long id;
private String name;
private double price;
/**
*@param price
* @param name
* @param id
* @类名:Order.java
*@描述:{todo}
*/
public Order(long id, String name, int price) {
this.id = id;
this.name = name;
this.price = price;
}
/**
* @return the id
*/
public Long getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the price
*/
public double getPrice() {
return price;
}
/**
* @param price the price to set
*/
public void setPrice(double price) {
this.price = price;
}
}
package www.skiff.cn.webservice.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;
/**
* @类功能说明: 服务端的拦截器
* @作者: 一叶扁舟 (skiff)
* @创建时间:2017年2月23日 下午12:05:22
* @版本:V1.0
*/
public class CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
public CheckUserInterceptor() {
super(Phase.PRE_PROTOCOL);
System.out.println("CheckUserInterceptor()");
}
/*
<Envelope>
<head>
<atguigu>
<name>xfzhang</name>
<password>123456</password>
</atguigu>
<atguigu2>
<name>xfzhang</name>
<password>123456</password>
</atguigu2>
<head>
<Body>
<sayHello>
<arg0>BOB</arg0>
<sayHello>
</Body>
</Envelope>
*/
@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("xfzhang".equals(name) && "123456".equals(password)) {
System.out.println("Server 通过拦截器....");
return;
}
}
//不能通过
System.out.println("Server 没有通过拦截器....");
throw new Fault(new RuntimeException("请求需要一个正确的用户名和密码!"));
}
}
/**
* @文件名称: OrderWSImpl.java
* @描述: TODO
* @作者: 一叶扁舟(skiff)
* @时间:2017年2月23日 上午10:00:15
* @版本:V1.0
*/
package www.skiff.cn.webservice.ws.impl;
import www.skiff.cn.webservice.domain.Order;
import www.skiff.cn.webservice.ws.IOrderWS;
/**
* @类功能说明:
* @作者: 一叶扁舟 (skiff)
* @创建时间:2017年2月23日 上午10:00:15
* @版本:V1.0
*/
public class OrderWSImpl implements IOrderWS {
/**
*@类名:OrderWSImpl.java
*@描述:{todo}
*/
public OrderWSImpl() {
System.out.println("OrderWSImpl()");
}
/* (non-Javadoc)
* @see www.skiff.cn.webservice.ws.OrderWS#getOrderById(java.lang.Long)
*/
@Override
public Order getOrderById(Long id) {
System.out.println("web server():");
return new Order(1L,"无悔",1000000000);
}
}
/**服务端的beans.xml文件
* @文件名称: OrderWS.java
* @描述: TODO
* @作者: 一叶扁舟(skiff)
* @时间:2017年2月23日 上午9:54:52
* @版本:V1.0
*/
package www.skiff.cn.webservice.ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
import www.skiff.cn.webservice.domain.Order;
/**
* @类功能说明: 创建一个SEI(终端服务接口)
* @作者: 一叶扁舟 (skiff)
* @创建时间:2017年2月23日 上午9:54:52
* @版本:V1.0
*/
@WebService
public interface IOrderWS {
@WebMethod
public Order getOrderById(Long id);
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<!-- 引cxf的一些核心配置 -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="orderWS" implementor="www.skiff.cn.webservice.ws.impl.OrderWSImpl"
address="/orderws" >
<!--配置服务端的入拦截器 -->
<!-- <jaxws:inInterceptors>
<bean class="com.atguigu.day01_ws.interceptor.CheckUserInterceptor"></bean>
</jaxws:inInterceptors> -->
</jaxws:endpoint>
</beans>
服务端的web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>webservice_cxf_spring</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置beans.xml -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<!--
应用启动的一个监听器
-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!--
所有请求都会先经过cxf框架
-->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
服务端结构图:
客户端:
1.生成客户端代码
2.写客户端调用代码
3.配置client-beans.xml
/**
* @文件名称: ClientTest.java
* @描述: TODO
* @作者: 一叶扁舟(skiff)
* @时间:2017年2月23日 上午11:14:04
* @版本:V1.0
*/
package www.skiff.cn.webservice.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import www.skiff.cn.webservice.ws.Order;
import www.skiff.cn.webservice.ws.impl.IOrderWS;
/**
* @类功能说明:
* @作者: 一叶扁舟 (skiff)
* @创建时间:2017年2月23日 上午11:14:04
* @版本:V1.0
*/
public class ClientTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"/client-beans.xml"});
IOrderWS orderWS = (IOrderWS) context.getBean("orderClient");
Order order = orderWS.getOrderById(2L);
System.out.println("----"+order);
}
}
package www.skiff.cn.webservice.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.apache.xml.utils.DOMHelper;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* @类功能说明: 创建一个客户端的拦截器
* @作者: 一叶扁舟 (skiff)
* @创建时间:2017年2月23日 上午11:35:41
* @版本:V1.0
*/
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;
System.out.println("AddUserInterceptor()....");
}
/*
<Envelope>
<head>
<atguigu>
<name>xfzhang</name>
<password>123456</password>
</atguigu>
<atguigu2>
<name>xfzhang</name>
<password>123456</password>
</atguigu2>
<head>
<Body>
<sayHello>
<arg0>BOB</arg0>
<sayHello>
</Body>
</Envelope>
*/
@SuppressWarnings("deprecation")
@Override
public void handleMessage(SoapMessage msg) throws Fault {
List<Header> headers = msg.getHeaders();
/*
<atguigu>
<name>xfzhang</name>
<password>123456</password>
</atguigu>
*/
Document document = DOMHelper.createDocument();
Element rootEle = document.createElement("atguigu");
Element nameELe = document.createElement("name");
nameELe.setTextContent(name);
rootEle.appendChild(nameELe);
Element passwordELe = document.createElement("password");
passwordELe.setTextContent(password);
rootEle.appendChild(passwordELe);
headers.add(new Header(new QName("atguigu"), rootEle));
System.out.println("client handleMessage()....");
}
}
client-beans.xml文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<!--产生的代理对象 -->
<jaxws:client id="orderClient" serviceClass="www.skiff.cn.webservice.ws.impl.IOrderWS"
address="http://localhost:8080/webservice_cxf_spring/orderws" >
<!--配置客户端的出拦截器 -->
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<bean class="www.skiff.cn.webservice.interceptor.AddUserInterceptor">
<constructor-arg name="name" value="xfzhang"/>
<constructor-arg name="password" value="123456"/>
</bean>
</jaxws:outInterceptors>
</jaxws:client>
</beans>