【参考:http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html 】
【参考:http://cxf.apache.org/docs/configuration.html 】
前几节讲了http和jms的传输协议的实现,这节介绍如何使用https来实现通信。
一、生成密钥
要使用https通信,首先我们需要生成一个用于双方通信的密钥文件,可以使用java自带的keytool工具来生成,例如:
keytool -genkey -alias gliu -keyalg RSA -storepass liu123 -keypass liu123 -keystore gliu.jks -dname "CN=localhost"
如果不指定 -keystore 参数,则会在用户目录下生成一个.keystore 文件。另外这里-dname里的CN参数需要指定为你的website的名字,例如对于本地测试,则使用localhost。
二、接口定义
和前几节一样,接口定义很简单:
@WebService public interface OrderProcess { public String processOrder(Order order); }
三、创建Service
要使得service支持https的传输协议,就需要用上面生成的密钥文件去配置服务引擎,首先在创建service时取得引擎对象:
JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean(); Bus bus = bean.getBus(); JettyHTTPServerEngineFactory serverEngineFactory = bus .getExtension(JettyHTTPServerEngineFactory.class);
然后就是配置引擎对象:
File file = new File("key/gliu.jks"); TLSServerParameters tlsParams = new TLSServerParameters(); KeyStore keyStore = KeyStore.getInstance("JKS"); String password = "liu123"; String storePassword = "liu123"; FileInputStream is = new FileInputStream(file); keyStore.load(is, storePassword.toCharArray()); is.close(); KeyManagerFactory keyFactory = KeyManagerFactory .getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyFactory.init(keyStore, password.toCharArray()); KeyManager[] keyManagers = keyFactory.getKeyManagers(); tlsParams.setKeyManagers(keyManagers); TrustManagerFactory trustFactory = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustFactory.init(keyStore); TrustManager[] trustManagers = trustFactory.getTrustManagers(); tlsParams.setTrustManagers(trustManagers); serverEngineFactory.setTLSServerParametersForPort(443, tlsParams);
最后创建服务即可:
bean.setAddress("https://localhost/security/order"); bean.setServiceBean(new OrderProcessImpl()); bean.setServiceClass(OrderProcess.class); bean.create();
启动服务后就可以通过以下路径访问生成的wsdl了:
https://localhost/security/order?wsdl
也可以使用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:sec="http://cxf.apache.org/configuration/security" xmlns:jetty="http://cxf.apache.org/transports/http-jetty/configuration" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd http://cxf.apache.org/transports/http-jetty/configuration http://cxf.apache.org/schemas/configuration/http-jetty.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <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" /> <jetty:engine-factory bus="cxf"> <jetty:engine port="443"> <jetty:tlsServerParameters> <sec:keyManagers keyPassword="liu123"> <sec:keyStore type="JKS" password="liu123" file="key/gliu.jks" /> </sec:keyManagers> </jetty:tlsServerParameters> </jetty:engine> </jetty:engine-factory> <jaxws:endpoint id="orderProcess" implementorClass="com.liulutu.liugang.https.OrderProcess" implementor="com.liulutu.liugang.https.OrderProcessImpl" address="https://localhost:443/security/order"> </jaxws:endpoint> </beans>
四、Client设置
一个简单的调用HTTPS服务的方式就是设置系统的ssl属性,例如调用上述service:
System.setProperty("javax.net.ssl.trustStore", "key/gliu.jks"); JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory .newInstance(); Client client = factory .createClient("https://localhost/security/order?wsdl"); Order order = new Order(); order.setId("helloId"); Object[] invokeWrapped = client.invoke("processOrder", order); System.out.println(invokeWrapped[0]);
也可以通过配置HTTPConduit对象来调用,例如:
//create and configure client bean JaxWsClientFactoryBean jwcfb = new JaxWsClientFactoryBean(); jwcfb.setServiceClass(OrderProcess.class); jwcfb.setAddress("https://localhost/security/order"); Client client = jwcfb.create(); //configure conduit HTTPConduit conduit = (HTTPConduit) client.getConduit(); configureSecurityInfoFor(conduit); //invoke Order order = new Order(); order.setId("helloId"); Object[] invokeWrapped = client.invoke("processOrder", order); System.out.println(invokeWrapped[0]);
其中configureSecurityInfoFor(conduit)方法实现如如下:
相关推荐
在我们的实例中,"CXF契约优先开发方式之客户端实现(client)"是基于CXF的客户端实现,它利用maven作为构建工具。Maven具有强大的插件系统,其中就包括CXF的插件,能够自动根据WSDL生成客户端的代理类。以下是如何...
这个压缩包包含了一个服务器端(cxfserver)和一个客户端(cxfclient),用于展示如何使用CXF和Spring来创建、消费SOAP Web服务。 【描述】在描述中提到,“soap webservice”表明此项目专注于SOAP协议,这是一种...
### CXF实现SSL安全验证 在现代网络应用中,安全通信是至关重要的。Apache CXF 是一个开源项目,提供了一套强大的工具和服务框架,用于构建和开发基于标准的服务(如 Web Services)。本文将详细介绍如何使用 CXF ...
- **CXF的Endpoint和Server**:在CXF中,Endpoint是实际对外提供服务的对象,而Server则负责启动和管理Endpoint。你可以通过`org.apache.cxf.frontend.ServerFactoryBean`配置并启动服务。 ### 3. Web Service...
在`frontend/client`或`frontend/server`的拦截器链中添加自定义拦截器,拦截器可以访问并处理Message对象中的header信息。 5. **创建客户端**:对于测试或集成,你可能需要创建一个CXF客户端,同样可以配置拦截器...
在这个例子中,"client"指的是使用CXF 2.1.3实现的客户端应用程序,它连接到"server"——运行XFire 1.2.6的服务端,进行交互。 在压缩包文件名"**cxf213**"中,我们可以推测这可能包含了CXF 2.1.3的相关库和配置...
Cxf_Server部分则展示了服务端的实现,可能包含服务接口、实现类、Spring配置文件以及启动脚本。在实际开发中,服务端会监听HTTP或HTTPS端口,接收客户端请求,并返回相应的响应。这部分的代码分析有助于理解CXF如何...
本文将详细讲解如何将Spring与CXF集成,以实现Web Service(包括HTTPS安全通信)。 首先,Spring是一个开源的Java平台,它提供了一个全面的编程和配置模型,用于简化Java应用的开发。Spring框架的核心特性包括依赖...
4. 发布服务:使用CXF的Server类,将服务绑定到特定端点。 **3. 创建Web服务客户端** CXF的客户端支持动态代理和静态代理两种方式。动态代理适合于服务端WSDL不可预知的情况,而静态代理则适用于已知WSDL的情况。 ...
本教程将通过CXF库来演示如何构建一个Web服务服务器(Server)以及对应的客户端(Client)。 一、CXF框架介绍: CXF全称是CXF CXF,前身为XFire,是一个强大的Java Web服务框架。它支持多种协议,包括RESTful API和...
CXF提供了多种方式来实现服务端和客户端,包括基于JAX-WS规范的Java API和基于XML配置的方式。 接下来,我们讨论Spring框架的角色。Spring是一个全面的企业级应用开发框架,它简化了Java EE的复杂性,提供了依赖...
SpringBoot整合CXF是将流行的Java Web服务框架CXF与SpringBoot轻量级框架结合,以便更方便地创建和消费Web服务。这个项目提供了一个很好的示例,通过详细注释帮助开发者理解如何在SpringBoot应用中发布和调用Web服务...
使用spring集成cxf,在两个web ...server端使用spring+springmvc+mybatis+cxf,client端使用struts2+spring+hibernate+cxf 两个工程均为myeclipse project,包含所有除myeclipse自带以外所有jar 内附 使用文档,数据库脚本
6. **CXF的Demo**:`Cxf_Client`文件可能包含了CXF的客户端示例,展示了如何配置和使用CXF客户端来调用远程Web服务。而`Cxf_Server`文件则可能是服务端的示例,涵盖了服务的创建、配置和服务发布。 7. **RESTful...
4. `cxf-rt-transports-http.jar`和`cxf-rt-transports-http-hc.jar`: 包含HTTP和HTTP Client的传输实现,用于通过HTTP/HTTPS协议进行通信。 5. `cxf-rt-ws-security.jar`: 提供Web服务安全特性,如WS-Security、...
"spring 3.0.5 集成cxf"这一主题聚焦于如何将Spring 3.0.5版本与Apache CXF整合,以实现高效、灵活的服务治理。 Spring 3.0.5是Spring框架的一个稳定版本,它引入了许多增强功能和改进,包括更好的类型安全依赖注入...
在本文中,我们将深入探讨如何使用Apache CXF框架与Java代码来实现Web服务。CXF是一个流行的开源项目,它提供了一种简单的方式来创建和消费Web服务。...这种源代码实现方式使得开发和测试Web服务变得更加直观和高效。
5. **测试与调试**:运行CXFServer和CXFClient,通过发送请求和接收响应来测试Web服务是否正常工作。这一步可以通过单元测试或集成测试来完成。 在提供的压缩包文件中,"CXFServer"可能包含了服务端的相关代码,...
6. **安全性集成**:CXF与Spring Security的整合可以实现Web服务的安全认证和授权,提供安全的通信环境。 7. **异常处理**:结合Spring的AOP,可以自定义全局的异常处理策略,提高服务的健壮性。 8. **实战案例**...
它可能包含了服务接口的Java接口,接口的实现类,以及使用CXF的Server类将服务部署到特定端口的代码。而`CxfClient`则可能包含客户端代码,用于生成服务代理并进行服务调用。 在`CxfService`中,我们可能会看到类似...