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_

时间: 2024-08-10 02:11:02

Web Service(二):cxf 实现的相关文章

Web Service (二) CXF自动发布Web Service(No Spring)

Web Service实现目前流行的框架主要有两种,cxf和axis这两个框架,下面是这两个框架的优缺点,我们这个项目中使用的是cxf这个框架,首先看一下没有集成spring的时候是怎么实现远程调用的. Axis与Cxf比较 在SOA领域,我们认为Web Service是SOA体系的构建单元(building block).这两个框架 都是从已有的开源项目发展起来的.这两个框架哪一个更好一些呢? 通过一个比较矩阵来比较Axis2和CXF变得有现实的意义.最主要的区别在以下几个方面: 1.CXF支

分布式系统(3)---Web Service实战--CXF理论篇

第一篇:CXF理论篇 在Java领域,WebService的框架很多,例如:AXIS,XFire,CXF等.AXIS,XFire相对比较成熟. Axis全程Apache Extensible Interaction System即Apache可扩展交互系统.是第三代Apache SOAP.本质上就是一个SOAP引擎,但不完全是一个SOAP引擎,它还是一个独立的SOAP服务器和一个嵌入Servlet引擎的服务器. XFire是新一代的Java Web服务引擎,可以非常容易地和Spring集成.是c

Web Service学习-CXF与Spring整合为JavaEE应用发布WebService(三)

CXF与Spring整合,分两个方面给大家介绍: 1,在传统ssh项目基础上添加Web Service 赋值CXF的jar包 在web.xml配置文件中导入CXF的核心控制器:CXFServlet 在Spring配置文件中导入CXF提供Schema,xml配置文件 在Spring配置文件中使用jaxws:endpoint元素来暴露Web Service 如果要添加拦截器,在jaxws:endpoint元素里添加 inInterceptors,outInterceptors子元素 2,远程调用We

Web Service学习-CXF开发Web Service的权限控制(二)

Web Service如何进行权限控制? 解决思路:服务器端要求input消息总是携带有用户名,密码信息,如果没有用户名和密码信息,直接拒绝调用 解决方案:拦截器 为了让程序员能访问,并修改CXF框架所生成的SOAP消息,CXF提供了拦截器 CXF(Celtix +XFire)说明: 如果不用CXF等框架,SOAP消息的生成,解析都是由程序员负责.无论是添加用户名,密码信息还是提取用户名,密码信息,都可由程序员代码完成. 如果使用CXF等框架,SOAP消息的生成,解析都是由CXF等框架来完成.

Web Service (四) 手动发布Web Service接口-CXF与Spring集成

当我们发布完Web Service接口之后有两种方式可以调用Web service服务,一种是通过动态客户端方式,另一种是引用服务端的接口,引用服务端接口的方式对于客户端同服务器端耦合比较大,而使用WSDL的方式客户端不知道服务端的存在就可以调用服务器的方法. 下面是项目的结构图: 1.Web Service发布项目 2.编写服务端接口类以及实现类,如下,同上一篇自动发布接口,多了一个注解@WebService package com.test.webservice; import javax.

Web Service学习-CXF开发Web Service实例demo(一)

Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样调用问题.比如.有一个C语言写的程序.它想去调用java语言写的某个方法. 集中解决:1,远程调用 2.跨平台调用 3,跨语言调用 实际应用: 1.同一个公司的新,旧系统的整合.Linux上的java应用,去调用windows平台的C应用 2,不同公司的业务整合.业务整合就带来不同公司的系统整合.不

分布式系统(3)---Web Service实战--CXF实践篇

第二篇:CXF实践篇 CXF架构开发WebService步骤: 1.建立Web项目 2.准备所有的jar包 3.web.xml中配置cxf的核心servlet,CXFServlet 服务器端: <display-name>cxf_demo</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpat

CXF实战之在Tomcat中公布Web Service(二)

服务接口及实现类请參考WebService框架CXF实战(一) 创建Maven Web项目,在pom.xml中加入CXF和Spring Web的引用,因为CXFServlet须要Spring Web的支持. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&quo

【转】基于CXF Java 搭建Web Service (Restful Web Service与基于SOAP的Web Service混合方案)

转载:http://www.cnblogs.com/windwithlife/archive/2013/03/03/2942157.html 一,选择一个合适的,Web开发环境: 我选择的是Eclipse for J2EE,当然大家可以选择MyEclipse我只是嫌最新版的MyEclipse Crack太烦,所以没用它.当年我也是最喜欢它的哟.如果你手头只有Eclipse for Java没关系,安装一个WTP就可以了. a.首先创建一个Dynamic Web Project : 在创建的第一页

Web Service学习之一:Web Service原理

一.定义 Web Service 不是框架也不是技术 而是解决远程调用.跨平台调用.跨语言调用问题的一种规范. 二.应用1.同一个公司新.旧系统的整合:比如CRM系统与OA.客服系统相互调用2.不同公司的业务组合:比如淘宝与物流公司信息平台调用3.内容聚合:比如天气预报.股市行情.新闻信息等 需要不同平台获取相关信息 三.web service 框架Axis(Apache)-->Axis2(Apache)XFire --> Celtrix(ESB框架) + XFire(web service框