最近调研了对webservice实现比较好的框架,觉得Apache的CXF不错.
做了一个简单的技术预研,其中主要包括2方面:1.与Spring的集成,2.安全性方面即WS-Security
首先与Spring的集成可以通过ContextLoaderListener去装配bean
在WS-Security方面可以与WSS4J集成
WSS4J支持多种模式:
XML Security:1.XML Signature 2.XML Encryption
Tokens:1.Username Tokens 2.Timestamps 3.SAML Tokens
做个了小的集成demo项目,项目的包结构如下:
服务端部分
1. 下面是web.xml的配置,主要配置cxf核心cxfServlet以及Spring的ContextLoaderListener
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"
version="2.5">
<display-name>CXF_Spring_INTG_Test</display-name>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:cxf.xml
</param-value>
</context-param>
<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>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<!-- configuration unique Web app root for log4j -->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>cxf.root</param-value>
</context-param>
</web-app>
2. cxf.xml配置
主要包括两部分:wss4j安全验证及webservice的管理
<?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">
<bean id="saaj" class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
<bean id="wss4j" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" >
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackClass" value="com.test.ws.handler.ServerWsAuthHandler" />
</map>
</constructor-arg>
</bean>
<jaxws:endpoint implementor="com.test.service.ITestWSImpl" address="/TestWS">
<jaxws:inInterceptors>
<ref bean="saaj" />
<ref bean="wss4j" />
</jaxws:inInterceptors>
</jaxws:endpoint>
</beans>
3. Server端进行WSS4J处理的Handler ServerWsAuthHandler,做了一个简单的密码为明文的验证
public class ServerWsAuthHandler implements CallbackHandler {
private String passwd = "test";
@Override
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
pc.setPassword(passwd);
}
}
}
4. WebService的接口ITestWS.java
package com.test.service;
import javax.jws.WebService;
@WebService
public interface ITestWS {
public String sayHello(String name);
}
5. WebService的实现类ITestWSImpl.java
package com.test.service;
import javax.jws.WebService;
@WebService(endpointInterface="com.test.service.ITestWS"
,serviceName="ITestWS")
public class ITestWSImpl implements ITestWS{
@Override
public String sayHello(String name) {
return "Hello "+name;
}
}
客户端部分
1. Client端进行WSS4J处理的Handler ClientWsAuthHandler.java
package com.test.ws.handler;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;
public class ClientWsAuthHandler implements CallbackHandler {
private String passwd = "test";
@Override
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
pc.setPassword(passwd);
}
}
}
2. Client端进行调用的测试类ClientTest
public class ClientTest {
private static List list = new ArrayList();
static{
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION,WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.USER, "admin");
//密码类型明文测试使用,还有很多如WSConstants.PASSWORD_DIGEST
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
//outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_DIGEST);
// 指定在调用远程ws之前触发的回调函数ClientWsAuthHandler,其实类似于一个拦截器
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS,ClientWsAuthHandler.class.getName());
// 添加cxf安全验证拦截器
list.add(new SAAJOutInterceptor());
list.add(new WSS4JOutInterceptor(outProps));
}
public static void main(String[] args){
//客户端采用动态创建及调用的方式
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
Client client =factory.createClient("http://localhost:8080/Spring_CXF/ws/TestWS?wsdl");
client.getOutInterceptors().addAll(list);
try {
String name = "Tom";
Object[] param = new Object[]{name};
Object[] obj =client.invoke("sayHello",param);
String rtnStr = (String) obj[0];
System.out.println(rtnStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
相关推荐
【CXF集成Spring Hibernate】是将三个核心的Java技术——CXF、Spring和Hibernate整合到一个应用程序中的实践。这样的集成可以构建出强大的企业级服务,其中CXF用于提供Web服务,Spring作为应用的管理和依赖注入容器...
这个"apache-cxf集成spring基本包"是用于将Apache CXF与Spring MVC框架结合使用的必要组件。Spring MVC是Spring框架的一部分,它为构建Web应用程序提供了一种模型-视图-控制器(MVC)结构。通过集成CXF,开发者可以...
Cxf集成Spring的WebService接口的配置文档
【标题】"cxf集成spring"涉及的知识点主要围绕着两个关键组件——Apache CXF和Spring框架的整合。Apache CXF是一个开源服务框架,它允许开发者创建和消费各种Web服务,而Spring则是一个广泛使用的Java企业级应用开发...
自己总结的一个CXF集成Spring的例子,可以直接运行,附源码! 程序的详细说明请参照博客文档 http://blog.csdn.net/sunbaojin5213344/article/details/8931600
总之,通过将CXF与Spring框架集成,我们可以利用Spring的强大功能来管理和配置服务,同时利用CXF的灵活性来快速开发RESTful接口。这种组合为Java开发者提供了一个高效且可扩展的解决方案,用于构建现代化的、基于...
在本文中,我们将深入探讨如何将Apache CXF与Spring框架集成,通过具体的Java代码实例来阐述这一过程。CXF是一个开源服务框架,它允许开发者创建和消费Web服务,而Spring框架则是一个强大的应用开发框架,提供了依赖...
- **cxfConnection**:这个名字暗示这可能是一个关于CXF连接配置的文件,可能包含了CXF与Spring集成的具体配置,例如服务的URL、认证信息、传输协议等。 - **cxfConsumer**:此文件名可能指的是CXF消费者,即...
将CXF与Spring集成,可以充分利用两者的优势,实现高效、灵活的RESTful服务。 本项目主要展示了如何使用CXF和Spring构建一个能够以JSON格式返回数据的RESTful WebService接口。JSON(JavaScript Object Notation)...
在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而CXF和Spring都是Java生态系统中的关键组件。本文将深入探讨如何将CXF与Spring框架整合,以构建高效且灵活的Web服务解决方案。 首先,让我们了解CXF。...
【描述】:“这个是cxf 集成spring 的webservice的例子 供大家参考” Apache CXF与Spring的集成使得开发和部署Web服务变得更加便捷。通过Spring,我们可以利用其依赖注入(DI)和面向切面编程(AOP)特性,更方便地...
在【压缩包子文件的文件名称列表】中,"cxf-spring"可能包含的是用于集成CXF与Spring的必要jar包,如cxf-spring-integration.jar,这个文件通常包含了CXF与Spring集成所需的类和资源,使得开发者能够在Spring环境下...
Spring还提供了一个强大的集成环境,可以方便地与其他框架和库进行整合,包括CXF。 将CXF与Spring整合的主要目的是利用Spring的管理能力来配置和控制CXF组件,例如服务端点、客户端代理等。这样可以实现更细粒度的...
8. **集成测试**:利用Spring Test和CXF的模拟测试工具,可以方便地进行Web服务的单元测试和集成测试。 9. **性能优化**:可以通过调整CXF的配置,例如缓存策略、线程池大小等,优化Web服务的性能。 10. **监控与...
同时,Spring的事务管理可以与CXF服务无缝集成,确保服务操作的事务一致性。 4. jar包解析: 压缩包中的jar文件可能包括了CXF的核心库、Spring框架的核心库、以及它们之间的适配器和依赖。例如: - CXF的相关jar...
现在,我们将深入探讨如何将CXF与Spring集成,以构建高效、灵活的Web服务。 首先,让我们理解CXF的核心特性。CXF支持多种Web服务规范,如SOAP、RESTful以及WS-*家族,如WS-Security、WS-ReliableMessaging等。它还...
在IT行业中,CXF和Spring框架的整合是创建高效、灵活的Web服务的重要途径。...这种集成方式也允许你在同一项目中使用Spring的其他功能,如数据库连接池、事务管理和安全控制,从而构建完整的分布式系统。
2. **CXF的Spring支持**:CXF提供了对Spring的深度集成,可以通过Spring的XML配置或注解来定义和管理Web服务。例如,使用`<jaxws:endpoint>`标签创建一个基于JAX-WS的服务端点,或者使用`<jaxrs:server>`创建基于JAX...