下载CXF
http://cxf.apache.org/download.html
以apache-cxf-3.0.12为例
服务器端
新建一个web项目
引入cxf lib下所有的包(图个方便)自带了spring相关包
编写一个UserService接口
package com.zns.ws; import javax.jws.WebService; @WebService public interface UserService { public String func1(String name); }
编写一个UserServiceImpl实现类
package com.zns.ws.impl; import javax.jws.WebService; import com.zns.ws.UserService; public class UserServiceImpl implements UserService { @Override public String func1(String name) { return "hello: "+name; } }
自定义一个拦截器
package com.zns.ws.server.interceptor; 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; public class CheckUserAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> { public CheckUserAuthInterceptor() { super(Phase.PRE_INVOKE); // 在调用方法之前调用自定拦截器 } @SuppressWarnings("null") @Override public void handleMessage(SoapMessage message) throws Fault { List<Header> headers = message.getHeaders(); if (headers == null && headers.size() == 0) { throw new Fault(new IllegalArgumentException("调用方没有提供Header信息...")); } Header firstHeader = headers.get(0); Element ele = (Element) firstHeader.getObject(); String userName = ele.getElementsByTagName("username").item(0).getTextContent(); String passWord = ele.getElementsByTagName("password").item(0).getTextContent(); if (userName.equals("zns") && passWord.equals("123456")) { System.out.println("验证用户授权信息成功..."); return; } System.out.println("验证用户授权信息失败..."); throw new Fault(new IllegalArgumentException("用户名或者密码错误!,请提供正确授权信息方可调用...")); } }
增加一个spring-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"> <!-- Import Apache CXF Bean Definition --> <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 implementor="com.zns.ws.impl.UserServiceImpl" address="/user"> <!-- 添加in拦截器 --> <jaxws:inInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> <bean class="com.zns.ws.server.interceptor.CheckUserAuthInterceptor" /> </jaxws:inInterceptors> <!-- 添加out拦截器 --> <jaxws:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> </jaxws:outInterceptors> </jaxws:endpoint> </beans>
修改web.xml
<!-- Spring Config Location --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-cxf.xml</param-value> </context-param> <!-- Spring ContextLoaderListener --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Apache CXFServlet --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- CXFServlet Mapping --> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping>
运行项目 访问测试
http://localhost:8080/项目名/ws/
http://localhost:8080/项目名/ws/user?wsdl
客户端调用
新建一个web项目
同样引入cxf lib下所有的包(图个方便)自带了spring相关包
用cxf的wsdl2java工具生成客户端代码调用
设置系统环境变量
CXF_HOME=D:\apache-cxf-xxx
在path后面加上 %CXF_HOME%/bin;
在cmd命令中输入wsdl2java,如果有提示usage,就表明配置成功
wsdl2java -p 生成代码的包名 -d 生成目录 -all xxx.wsdl
-p 指定其wsdl的命名空间,也就是要生成代码的包名:
-d 指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web service的代码
-impl 生成web service的实现代码
-ant 生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file
wsdl2java -p com.zns.ws.output -d D:\EclipseWorkSpace\TestClient\src -all http://localhost:8080/项目名/ws/user?wsdl
执行命令后 刷新工程文件
编写一个拦截器来追加认证header信息
package com.zns.ws.client.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.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 AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String username; private String password; public AddHeaderInterceptor(String username, String password) { super(Phase.PRE_PROTOCOL);// 准备协议化时拦截 this.username = username; this.password = password; } @Override public void handleMessage(SoapMessage message) throws Fault { List<Header> headerList = message.getHeaders(); Document doc = DOMUtils.createDocument(); Element ele = doc.createElement("authHeader"); Element uElement = doc.createElement("username"); uElement.setTextContent(username); Element pElement = doc.createElement("password"); pElement.setTextContent(password); ele.appendChild(uElement); ele.appendChild(pElement); headerList.add(new Header(new QName("authHeader"), ele)); } }
测试调用
package com.zns.ws.test; import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import com.zns.ws.client.interceptor.AddHeaderInterceptor; import com.zns.ws.output.UserService; import com.zns.ws.output.UserServiceImplService; public class test { public static void main(String[] args) { UserServiceImplService userServiceImplService = new UserServiceImplService(); UserService userService = userServiceImplService.getUserServiceImplPort(); Client client = ClientProxy.getClient(userService); // 添加自定义拦截器 client.getOutInterceptors().add(new AddHeaderInterceptor("zns", "123456")); // 添加In拦截器 日志拦截器 client.getInInterceptors().add(new LoggingInInterceptor()); // 添加Out拦截器 日志拦截器 client.getOutInterceptors().add(new LoggingOutInterceptor()); // 调用方法 String result = userService.func1("abc"); System.out.println(result); } }