通过上一篇文章《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>