webservice学习笔记(6)--spring结合xsf拦截器

来源:互联网 发布:linux rhel 环境变量 编辑:程序博客网 时间:2024/05/18 03:45
/**      * @文件名称: 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> */@Overridepublic 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) */@Overridepublic 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   */@WebServicepublic interface IOrderWS {@WebMethodpublic 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.xsdhttp://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")@Overridepublic 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.xsdhttp://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>


0 0