Web Service:cxf 实现
Posted 孙猴子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web Service:cxf 实现相关的知识,希望对你有一定的参考价值。
1. cxf简介
Web Services 的一种实现方式。
Apache CXF = Celtix + XFire,后更名为 Apache CXF ,简称为 CXF。
CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。
2. JAX-WS
JAX-WS(Java API for XML Web Services)规范是一组XML web services的JAVA API。
在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP,在使用JAX-WS过程中,*开发者不需要编写任何生成和处理SOAP消息的代码*。JAX-WS的运行时实现会将这些API的调用转换成为对应的SOAP消息。
* 在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI(service endpoint interface),并提供相关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。(发布服务 详见5.1)
* 在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端的调用。(创建代理 详见5.2)
JAX-WS 也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch 直接使用SOAP消息或XML消息发送请求或者使用Provider处理SOAP或XML消息。
3. cxf特点
部署灵活、支持多种编程语言、多种传输方式。
4. 代码生成
Java to WSDL;
WSDL to Java;
XSD to WSDL;
WSDL to XML;
WSDL to SOAP;
WSDL to Service;
5. 实践
5.1 服务器端
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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- cxf webservice --> <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"/> <bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" /> <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/> <cxf:bus> <cxf:inInterceptors> <ref bean="loggingInInterceptor"/> </cxf:inInterceptors> <cxf:outInterceptors> <ref bean="loggingOutInterceptor"/> </cxf:outInterceptors> <cxf:outFaultInterceptors> <ref bean="loggingOutInterceptor"/> </cxf:outFaultInterceptors> <cxf:inFaultInterceptors> <ref bean="loggingInInterceptor"/> </cxf:inFaultInterceptors> </cxf:bus> <bean id="serverPasswordCallback" class="util.web.ServerPasswordCallback" /> <bean id="authentication_server" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor"> <constructor-arg> <map> <entry key="action" value="UsernameToken" /> <entry key="passwordType" value="PasswordText" /> <entry key="user" value="FHDServer" /> <entry key="passwordCallbackRef"> <ref bean="serverPasswordCallback" /> </entry> </map> </constructor-arg> </bean>
<!-- 注意下面的address,这里的address的名称就是访问的WebService的name --> <!-- 外协完工登记 --> <bean id="mesTaskServiceImpl" class="com.outsideasy.ws.mes.wxdata.MesTaskServiceImpl"> </bean> <jaxws:server id="mesTaskServiceInter" serviceClass="com.outsideasy.ws.mes.wxdata.MesTaskServiceInter" address="/wxdata/mesTask"> <jaxws:serviceBean> <ref bean="mesTaskServiceImpl"/> </jaxws:serviceBean> <jaxws:inInterceptors> <ref bean="authentication_server"></ref> </jaxws:inInterceptors> </jaxws:server> <cxf:bus> <cxf:features> <cxf:logging/> </cxf:features> </cxf:bus> </beans>
ServerPasswordCallback.java
package util.web; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; import javax.servlet.http.HttpServletRequest; import org.apache.cxf.message.Exchange; import org.apache.cxf.message.Message; import org.apache.cxf.staxutils.W3CDOMStreamWriter; import org.apache.log4j.Logger; import org.apache.ws.security.WSPasswordCallback; import org.apache.ws.security.handler.RequestData; import org.springframework.beans.factory.annotation.Autowired; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import common.sysmodule.model.WsIdentity; import common.sysmodule.service.WsIdentityService; public class ServerPasswordCallback implements CallbackHandler { @Autowired private WsIdentityService wsIdentityService; protected static Logger logger = Logger.getLogger("service"); public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; String identify = pc.getIdentifier(); //身份验证 List<WsIdentity> list=wsIdentityService.getEnabledIdentity(identify); if (list!=null && list.size()>0 && list.get(0).getIdentify().equals(identify)) { pc.setPassword(list.get(0).getPsw());//验证用户名后,在设置密码就可以自动验证 } else { throw new SecurityException("验证失败"); } } }
参考链接:
以上是关于Web Service:cxf 实现的主要内容,如果未能解决你的问题,请参考以下文章
在Myeclipse下使用CXF和Spring开发Web Service
用cxf做web service时,到底应该导入哪些包?哪个版本最好我照着网上的例子,没有一次对的,总是出现异常
web service014——spring整合jaxws发布和调用CXF类型的webservice服务,拷贝服务端接口文件方式