`
zxlaiye
  • 浏览: 96276 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

CXF使用笔记

    博客分类:
  • java
阅读更多
第一次用CXF的服务端,写个简单的笔记。

●一、引用的包
直接上maven的pom,里面嵌套引用了好多jar,看起来不是那么爽。
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>2.6.0</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>2.6.0</version>
</dependency>


●二、写个简单的服务类(不写接口,懒。。)。没什么特别的,只有一个@WebService注解。
@WebService
public class TestService{
    public String doSomething(String msg){
        System.out.println("有人来访问了,消息:" + msg);
        return "谢谢惠顾,您的消息是:" + msg;
    }
}


●三、在Spring中配置服务(习惯使用spring了,这里不包括spring的其它配置)
<?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:jaxws="http://cxf.apache.org/jaxws"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
                        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    <description>WebService配置</description>

    <jaxws:endpoint implementor="TestService" address="/test"/>
</beans>


●四、在web.xml中配置CXF的Servlet。(这里不包括spring的配置)
    这里把servlet的路径配置成http://host:port/app/ws
<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>/ws/*</url-pattern>  
</servlet-mapping>

   
    服务端完成。简单吧。
    启动tomcat,访问http://host:port/app/ws,应该看到一个“Available SOAP services”的列表。如果不行,自己看看异常找找原因。。。

●五、用客户端来访问刚才的服务。还是用CXF,其它的不会用。先用CXF提供的wsdl2java工具(在CXF的bin目录下)生成客户端的代码。假设这些代码放在包test中,暂时存放于d:盘中。
CXF主目录/bin/wsdl2java -p test -d d: http://host:port/app/ws/test?wsdl

回车,稍等,在d:盘中生成了一个test目录,里面有几个类,有用的是以下四个:
TestService.java
DoSomething.java
DoSomethingResponse.java
ObjectFactory.java

将这些类复制到客户端工程的test包下。

●六、在客户端配置spring(还是spring...)。
这个配置文件叫client-beans.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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="client" class="test.TestService"
        factory-bean="clientFactory" factory-method="create"/>
    
	<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
        <property name="serviceClass" value="test.TestService"/> <!-- 这个类是刚才生成的 -->
        <property name="address" value="http://host:port/app/ws/test"/> <!-- 这个路径是服务器端配置的 -->
	</bean>
</beans>


●七、编写客户端代码。在这之前应该像服务端那样引入了spring和cxf相关的包。
这些代码很明了,解释是多余的。难怪会喜欢用sping。
public class ClientTest {
	public static void main(String args[]) throws Exception {
        ClassPathXmlApplicationContext context = 
        		new ClassPathXmlApplicationContext(new String[] {"client-beans.xml"});
        TestService client = context.getBean(TestService.class);
        String res = client.doSomething("Hi, boy. I come!");
        System.out.println(res);
        System.exit(0);
    }
}

分别看看服务端和客户端的输出,体验一下两者大概是怎样交互的。

●八、以上已告一段落。下面要添加一点安全性,用最简单的“用户名-密码”方式。当然要先处理服务端。首先要引用两组新的依赖库:
<!-- WSS4J -->
<dependency>
    <groupId>org.apache.ws.security</groupId>
    <artifactId>wss4j</artifactId>
    <version>1.6.5</version>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-ws-security</artifactId>
    <version>2.6.0</version>
</dependency>


●九、写一个验证用户名和密码的类
写最简单的,能表现出原理就行。类起名为PasswordCallback。假定提供的用户名是"user123",密码是"pwd123"。
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
public class PasswordCallback implements CallbackHandler {	
	@Override
	public void handle(Callback[] callbacks) throws Exception{
		for (Callback cb : callbacks){
			WSPasswordCallback pc = (WSPasswordCallback)cb;
            if ("user123".equals(pc.getIdentifier())){
                pc.setPassword("pwd123");
            }
		}
	}
}


●十、修改spring中的配置,加入拦截器
原本是这样的
<jaxws:endpoint implementor="TestService" address="/test"/>

修改后是
<jaxws:endpoint implementor="TestService" address="/test">
	<jaxws:inInterceptors>
		<ref bean="wss4JInInterceptor"/>
	</jaxws:inInterceptors>
</jaxws:endpoint>
<bean id="wss4JInInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
	<constructor-arg>
		<map>
			<entry key="action" value="UsernameToken"/>
			<entry key="passwordType" value="PasswordDigest"/>
			<entry key="passwordCallbackRef">
				<bean class="PasswordCallback"/> <!-- 刚刚写的那个类 -->
			</entry>
		</map>
	</constructor-arg>
</bean>

以下看起来有点复杂,大概意思是:在endpoint中加入一个拦截器,这个拦截器将验证方式配置为"UsernameToken",将密码类型配置为"PasswordDigest",将执行密码验证的类配置为PasswordCallback。这样想就合情合理,不复杂了。

●十一、重新启动tomcat。再运行之前的客户端代码,抛异常了吧,被拒绝了吧。要正常访问,客户端也要做相应的修改:加入拦截器,加入密码。首先,也像服务端那样引入wss4j相关的包;接着,写一个设置密码的类,叫ClientPasswordCallback,代码如下:
public class ClientPasswordCallback implements CallbackHandler {	
	@Override
	public void handle(Callback[] callbacks) throws Exception{
		for (Callback cb : callbacks){
			WSPasswordCallback pc = (WSPasswordCallback)cb;
            pc.setPassword("pwd123");
		}
	}
}

很简单,就直接将密码设置为pwd123而已。当然只是演示时才这样。至于用户名,是在配置文件中设置。

●十二、修改客户端的spring配置文件
    定义一个拦截器,当然与服务端的WSS4JInInterceptor不同,客户端的拦截器是WSS4JOutInterceptor。
<bean id="wss4JOutInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
	<constructor-arg>    
		<map>
			<entry key="action" value="UsernameToken" /> <!-- 要和服务端的配置一致 -->
			<entry key="passwordType" value="PasswordDigest" /> <!-- 要和服务端的配置一致 -->
			<entry key="user" value="user123" /> <!-- 用户名在这里设置 -->
			<entry key="passwordCallbackRef">
				<bean class="ClientPasswordCallback"/> <!-- 密码在这里设置 -->
			</entry>
		</map>
	</constructor-arg>    
</bean>

    将这个拦截器添加到clientFactory中,注意是outInterceptors,服务端的才是inInterceptors。
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
	<property name="serviceClass" value="test.TestService"/>
	<property name="address" value="http://host:port/app/ws/test"/>
	<property name="outInterceptors">
		<list>
			<ref bean="wss4JOutInterceptor"/>
		</list>
	</property>
</bean>

    OK,配置完毕。看起来有点麻烦,其实也不算太复杂,对吧。

●十三、再次运行客户端代码,应该又可以看到正常的结果了。如果不行,自己看看异常找找原因。。。
    有一个问题,如果客户端不用CXF,而是用Axis或其它,应该怎样通过安全验证呢,没试过。
分享到:
评论

相关推荐

    超详细CXF学习笔记

    WebService的实现——CXF学习笔记

    总结,本篇学习笔记通过一个简单的CXF服务端和客户端示例,介绍了CXF框架的使用,包括接口定义、实现、实体类以及相关配置。通过对这些概念和步骤的理解,读者可以快速入门CXF并开始创建自己的Web服务。

    webservice+cxf基础笔记和视频,

    总的来说,这份“webservice+cxf基础笔记和视频”资源将引导你进入Web服务的世界,通过学习和实践,你可以掌握使用CXF和Spring进行Web服务开发的基本技能。无论你是初学者还是有一定经验的开发者,这都将是一份有...

    CXF学习笔记.docx )

    下面我们将深入探讨CXF的功能特性、概述、支持的协议和传输方式,以及它的特点和环境要求,并提供一个实践讲解,帮助理解如何使用CXF进行开发。 1. CXF 简介 - 功能特性:CXF提供了丰富的功能,包括SOAP、RESTful...

    cxf3.0 spirng 集成笔记

    在本文中,我们将探讨如何将Apache CXF 3.0.2版本集成到Spring框架中,以及在这个过程中可能遇到的问题和解决方案。Apache CXF是一个开源的SOA(Service-Oriented Architecture)框架,它允许开发人员创建和消费各种...

    Apache_cxf_学习笔记

    本学习笔记旨在提供对Apache CXF的基本理解、功能特性和实际操作指导。 **1. CXF 简介** 1.1 CXF概述 Apache CXF是一个全面的服务开发框架,它允许开发者创建和部署各种类型的Web服务,包括基于SOAP、RESTful、WS-...

    Apache cxf 学习笔记.pdf

    - Maven 或 Ant:CXF项目通常使用Maven进行构建,但也可以通过Ant或其他构建工具进行管理。 - IDE支持:Eclipse、IntelliJ IDEA等IDE有专门的CXF插件,可以提供更好的开发体验。 **3. 实践讲解** **2.1 CXF 开发...

    cxf学习笔记

    本篇CXF学习笔记详细介绍了使用CXF框架结合Spring框架发布Web服务的基本流程和技术要点。从简单的Hello World示例入手,逐步深入到复杂的数据类型处理、大数据传输以及安全性保障等方面。通过这些实践案例的学习,...

    Axis2,CXF版本学习笔记

    当我们谈论“Axis2,CXF版本学习笔记”时,这通常涉及到两个主要的Java Web服务框架:Apache Axis2和Apache CXF。这两个框架都用于构建和部署SOAP(简单对象访问协议)和RESTful(Representational State Transfer)...

    CXF笔记

    【CXF笔记】是关于Apache CXF框架的深入学习记录,该笔记可能涵盖了CXF的基本概念、使用方法、源码解析以及与工具的结合应用。Apache CXF是一个开源的Java框架,主要用于构建和开发Web服务。它允许开发者通过Java...

    CXF webservice初学笔记

    【CXF Webservice初学笔记】 在IT行业中,Web服务是一种允许不同系统之间进行通信和交换数据的方法。Apache CXF是一个流行的开源框架,用于构建和部署Web服务。本笔记将探讨CXF Webservice的基础知识,包括其核心...

    cxf学习笔记之结合spring创建客户端

    在IT行业中,CXF是一个广泛使用的开源框架,用于构建和服务导向架构(SOA)的应用程序。本篇将探讨如何结合Spring框架创建一个CXF客户端,从而实现服务的调用。首先,我们需要理解CXF和Spring的基本概念。 **CXF** ...

Global site tag (gtag.js) - Google Analytics