/** * @文件名称: Order.java * @描述: TODO * @作者: 一叶扁舟(skiff) * @时间:2017年2月23日 上午9:47:35 * @版本:V1.0 */package www.skiff.cn.webservice.domain;/** * @类功能说明: * @作者: 一叶扁舟 (skiff
/** * @文件名称: 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); } }
/** * @文件名称: 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); }服务端的beans.xml文件
<?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>