欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

关于该命令 昆山软件定制开发 的使用方法

点击: 次  来源:宝鼎软件 时间:2017-05-31

原文出处: 黄勇

通过上一篇文章《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 的根节点,它包罗两个重要的属性:

  1. name:WS 名称,默认为“WS 实现类 + Service”,譬喻:HelloServiceImplService
  2. targetNamespace:WS 方针定名空间,默认为“WS 实现类对应包名倒排后组成的地点”,譬喻:http://soap_spring_cxf.ws.demo/

提示:可以在 javax.jws.WebService 注解中设置以上两个属性值,劳务派遣管理系统,但这个设置必然要在 WS 实现类长举办,WS 接口类只需标注一个 WebService 注解即可。

在 definitions 这个根节点下,有五种范例的子节点,它们别离是:

  1. types:描写了 WS 中所涉及的数据范例
  2. portType:界说了 WS 接口名称(endpointInterface)及其操纵名称,以及每个操纵的输入与输出动静
  3. message:对相关动静举办了界说(供 types 与 portType 利用)
  4. binding:提供了对 WS 的数据绑定方法
  5. service:WS 名称及其端口名称(portName),以及对应的 WSDL 地点

个中包罗了两个重要信息:

  1. portName:WS 的端口名称,默认为“WS 实现类 + Port”,譬喻:HelloServiceImplPort
  2. endpointInterface:WS 的接口名称,默认为“WS 实现类所实现的接口”,譬喻:HelloService

提示:可在 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 动静的布局有着异曲同工之妙!

看到这里,您或者会有许多疑问:

  1. WS 不该该让任何人都可以挪用的,这样太不安详了,至少需要做一个身份认证吧?
  2. 为了制止第三方恶意措施监控 WS 挪用进程,可否对 SOAP Body 中的数据举办加密呢?
  3. SOAP Header 中毕竟可存放什么对象呢?

没错!这就是我们本日要展开接头的话题 —— 基于 SOAP 的安详节制。

在 WS 规模有一个很强悍的办理方案,名为 WS-Security,软件开发,它仅仅是一个类型,在 Java 业界里有一个很权威的实现,名为 WSS4J。

下面我将一步步让您学会,如何利用 Spring + CXF + WSS4J 实现一个安详靠得住的 WS 挪用框架。

其实您需要做也就是两件工作:

  1. 认证 WS 请求
  2. 加密 SOAP 动静

奈何对 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>