一 服务端
1 创建一个服务端的web工程,导入jar包
2 编写webservice的接口和实现类。
2 编写服务器端的入拦截器,该类继承AbstractPhaseInterceptor
package com.spring.wl.auth;
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.Node;
import org.w3c.dom.NodeList;
//PhaseInterceptor 可以指定拦截器在哪个阶段起作用
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
public AuthInterceptor() {
super(Phase.PRE_INVOKE);//调用之前拦截soap消息
System.out.println("服务器端拦截器初始化");
}
@Override
public void handleMessage(SoapMessage msg) throws Fault {
System.out.println("服务端拦截器="+msg);
List<Header>headers=msg.getHeaders();
if( headers==null||headers.size()<=0){
throw new Fault(new IllegalArgumentException("没有header 不能调用"));
}
Header firstHeader=headers.get(0);
Element ele=(Element)firstHeader.getObject();
NodeList userIds= ele.getElementsByTagName("userId");
NodeList passwards= ele.getElementsByTagName("password");
System.out.println("用户名个数="+userIds.getLength());
System.out.println("密码个数="+passwards.getLength());
if(userIds.getLength()!=1 || passwards.getLength()!=1 ){
throw new Fault(new IllegalArgumentException("格式不对"));
}
String userId= userIds.item(0).getTextContent();
String passward= passwards.item(0).getTextContent();
System.out.println("用户名="+userId);
System.out.println("密码="+passward);
if(!"wl".equals(userId)||!"1985310".equals(passward) ){
throw new Fault(new IllegalArgumentException("用户名或者密码不对"));
}
System.out.println("通过服务端拦截器");
}
}
3 配置cxf的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="com.spring.wl.ws.impl.OrderWSImpl" address="/orderws" >
<jaxws:inInterceptors>
<bean class="com.spring.wl.auth.AuthInterceptor"> </bean>
</jaxws:inInterceptors>
</jaxws:endpoint>
</beans>
implementor; 接口的实现类
address: webservice的注册的地址
jaxws:inInterceptors 服务器端的入拦截器类
4 配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!--
配置bean.xml
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:bean.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>
CXFServlet是一个jar包里面的servlet类,匹配该地址的请求都会先经过servlet.
5 启动web工程。
二 编写客户端
1 通过服务器端wsdl生成客户端代码
2 编写客户端的拦截器
package com.spring.wl.auth;
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;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
//PhaseInterceptor 可以指定拦截器在哪个阶段起作用
public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private String userId;
private String password;
public AddHeaderInterceptor(String userId,String password) {
super(Phase.PREPARE_SEND);//准备发送soap消息的时候
this.userId=userId;
this.password=password;
System.out.println("客户端端拦截器初始化");
}
@Override
public void handleMessage(SoapMessage msg) throws Fault {
System.out.println("客户端拦截器"+msg);
List<Header>headers=msg.getHeaders();
Document doc=DOMUtils.createDocument();
Element ele=doc.createElement("authHeader");
Element idEle=doc.createElement("userId");
idEle.setTextContent(userId);
Element passwordEle=doc.createElement("password");
passwordEle.setTextContent(password);
ele.appendChild(idEle);
ele.appendChild(passwordEle);
headers.add(new Header( new QName("www.xxx") ,ele));
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3 配置客户端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">
<!--
***注意***
手动添加的内容:
xmlns:jaxws="http://cxf.apache.org/jaxws"
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
-->
<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:client id="orderClient" serviceClass="com.spring.wl.ws.OrderWS" address="http://localhost:8080/cxf_spring/orderws">
<jaxws:outInterceptors >
<bean class="com.spring.wl.auth.AddHeaderInterceptor">
<constructor-arg name="userId" value="wl"/>
<constructor-arg name="password" value="1985310"/>
</bean>
</jaxws:outInterceptors>
</jaxws:client>
</beans>
address:服务器端发布的webservice地址
jaxws:outInterceptors 客户端out拦截器
启动客户端,调用服务端的webservice方法
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.wl.ws.Order;
import com.spring.wl.ws.OrderWS;
public class HelloServiceClient {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
OrderWS orderWS = (OrderWS) context.getBean("orderClient");
Order order = orderWS.getOrderById(2);
System.out.println(order.getName());
}
}
结果如下: