CXF SOAP 及其安全控制

本文详细介绍了WSDL和SOAP的基本概念及作用,并重点探讨了如何利用Spring、CXF和WSS4J实现安全可靠的Web服务调用框架。

通过上一篇文章,相信您已经学会了如何使用 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 文档:

wsdl

其中,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 消息是这样的:

inbound

可见,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 

转载于:https://www.cnblogs.com/liuchuanfeng/p/6839610.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值