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("验证失败");
        }
        
    }

}

 

 

 

 

参考链接:

  1. http://baike.baidu.com/link?url=WOTPK-J7UxJuXZ6hMr8OPYDMItaEHwva8wzOEUSM3wKXF5KgBBXRM8VfgA-kUE_RrAoNMYFipZY0VK_kCtpw8_

 


以上是关于Web Service:cxf 实现的主要内容,如果未能解决你的问题,请参考以下文章

Web Service——CXF+Spring 整合

CXF实战之在Tomcat中公布Web Service

在Myeclipse下使用CXF和Spring开发Web Service

用cxf做web service时,到底应该导入哪些包?哪个版本最好我照着网上的例子,没有一次对的,总是出现异常

web service014——spring整合jaxws发布和调用CXF类型的webservice服务,拷贝服务端接口文件方式

Web Service学习之一:Web Service几种框架