通过上一篇文章《Web Service 那点事儿(2)—— 利用 CXF 开拓 SOAP 处事》,相信您已经学会了如何利用 CXF 开拓基于 SOAP 的 WS 了。或者您今朝对付底层道理性的对象还不太领略,心中不免会有些疑问:
什么是 WSDL?
什么是 SOAP?
如何能让 SOAP 越发安详?
我将尽力通过本文,针对以上问题,让您获得一个满足的谜底。
还等什么呢?就从 WSDL 开始吧!
WSDL 的全称是 Web Services Description Language(Web 处事描写语言),用于描写 WS 的详细内容。
当您乐成宣布一个 WS 后,就能在欣赏器中通过一个地点查察基于 WSDL 文档,它是一个基于 XML 的文档。一个典范的 WSDL 地点如下:
http://localhost:8080/ws/soap/hello?wsdl
留意:WSDL 地点必需带有一个 wsdl 参数。
在欣赏器中,您会看到一个尺度的 XML 文档:

个中,definitions 是 WSDL 的根节点,它包罗两个重要的属性:
提示:可以在 javax.jws.WebService 注解中设置以上两个属性值,劳务派遣管理系统,但这个设置必然要在 WS 实现类长举办,WS 接口类只需标注一个 WebService 注解即可。
在 definitions 这个根节点下,有五种范例的子节点,它们别离是:
个中包罗了两个重要信息:
提示:可在 javax.jws.WebService 注解中设置 portName 与 endpointInterface,同样必需在 WS 实现类上设置。
假如说 WSDL 是用于描写 WS 是什么,那么 SOAP 就用来暗示 WS 里有什么。
其实 SOAP 就是一个信封(Envelope),在这个信封里包罗两个部门,一是头(Header),二是体(Body)。用于传输的数据都放在 Body 中了,一些非凡的属性需要放在 Header 中(下面会看到)。
一般环境下,将需要传输的数据放入 Body 中,而 Header 是没有任何内容的,看起来整个 SOAP 动静是这样的:

可见,HTTP 请求的 Request Header 与 Request Body,这正好与 SOAP 动静的布局有着异曲同工之妙!
看到这里,您或者会有许多疑问:
没错!这就是我们本日要展开接头的话题 —— 基于 SOAP 的安详节制。
在 WS 规模有一个很强悍的办理方案,名为 WS-Security,软件开发,它仅仅是一个类型,在 Java 业界里有一个很权威的实现,名为 WSS4J。
下面我将一步步让您学会,如何利用 Spring + CXF + WSS4J 实现一个安详靠得住的 WS 挪用框架。
其实您需要做也就是两件工作:
奈何对 WS 举办身份认证呢?可利用如下办理方案:
1. 基于用户令牌的身份认证
第一步:添加 CXF 提供的 WS-Security 的 Maven 依赖
<!-- lang: xml -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>${cxf.version}</version>
</dependency>
其实底层实现照旧 WSS4J,CXF 只是对其做了一个封装罢了。
第二步:完成处事端 CXF 相关设置
<!-- lang: 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:cxf="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.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">
<bean id="wss4jInInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<!-- 用户认证(明文暗码) -->
<entry key="action" value="UsernameToken"/>
<entry key="passwordType" value="PasswordText"/>
<entry key="passwordCallbackRef" value-ref="serverPasswordCallback"/>
</map>
</constructor-arg>
</bean>
<jaxws:endpoint id="helloService" implementor="#helloServiceImpl" address="/soap/hello">
<jaxws:inInterceptors>
<ref bean="wss4jInInterceptor"/>
</jaxws:inInterceptors>
</jaxws:endpoint>
<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
</cxf:bus>
</beans>