文档章节

WebService服务端拦截器,和soap信息格式

xpttxsok
 xpttxsok
发布于 2016/05/02 16:09
字数 987
阅读 609
收藏 2
webservice写的程序任何客户端都能调用,和语言无关,考虑到系统的安全性稳定性,和某些利益关系,可以考虑webservice的
拦截器控制.webservice的调用过程如下图:

如果不用cxf框架,soap消息的生成,解析都是由程序员自己负责,无论是添加用户名,密码还是提取用户名密码等信息,都是由
程序员的代码完成,如果用了cxf框架,soap消息的生成,解析都是有cxf框架完成
为了进行权限控制,我们可以在服务端要求input消息必须带入验证信息如:用户名,密码等,如果验证错误,就拒绝调用


拦截器:
   cxf的拦截器可以让程序员修改框架生成的soap信息.

cxf拦截器的实现方式,下图介绍:

服务端代码:

/**
 * @author xp
 * @Title: WebServicePublish.java
 * @Package com.xp.cn
 * @Description: TODO
 * @date 2016年4月30日 下午9:06:49
 * @version V1.0  
 */
package com.xp.cn;

import javax.xml.ws.Endpoint;




import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;

import com.xp.cn.ws.IWebServiceDemo;
import com.xp.cn.ws.impl.WebServiceImpl;


/**
 * @author xp
 * @ClassName: WebServicePublish
 * @Description: TODO
 * @date 2016年4月30日 下午9:06:49
 *
 */
public class WebServicePublish {
	public static void main(String[] args) {
		IWebServiceDemo demo = new WebServiceImpl();
		//调用EndPoint发布服务
		EndpointImpl endPoint = (EndpointImpl) Endpoint.publish("http://127.0.0.1/XXX", demo);
		//自定义拦截器实现Interceptor接口,实际上我们一般会继承AbstractPhaseInterceptor
		//添加服务端in拦截去
		endPoint.getInInterceptors().add(new LoggingInInterceptor());
		//添加服务端out连接器
		endPoint.getOutInterceptors().add(new LoggingInInterceptor());
	}
}

服务端代码永远是in拦截器先起作用,再是out拦截器

运行客户端后,服务端控制台打印信息:

----------------------------
ID: 1
Address: http://127.0.0.1/XXX?wsdl
Http-Method: GET
Content-Type: 
Headers: {Accept=[text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive], Content-Type=[null], Host=[127.0.0.1], User-Agent=[Java/1.7.0_40]}
--------------------------------------
五月 02, 2016 6:01:02 下午 org.apache.cxf.services.webServiceImpl.WebServiceImplPort.IWebServiceDemo
信息: Inbound Message
----------------------------
ID: 2
Address: http://127.0.0.1/XXX?wsdl=IWebServiceDemo.wsdl
Http-Method: GET
Content-Type: 
Headers: {Accept=[text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive], Content-Type=[null], Host=[127.0.0.1], User-Agent=[Java/1.7.0_40]}
--------------------------------------

ID:1和ID2分别是客户端得到wsdl文档
----------------------------
ID: 3
Address: http://127.0.0.1/XXX
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[text/xml, multipart/related], connection=[keep-alive], Content-Length=[193], content-type=[text/xml; charset=UTF-8], Host=[127.0.0.1], SOAPAction=[""], User-Agent=[JAX-WS RI 2.2.4-b01]}
Payload: 
<?xml version="1.0" ?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Body>
            <ns2:sayHello xmlns:ns2="http://ws.cn.xp.com/">
                <arg0>xp</arg0>
                </ns2:sayHello>
         </S:Body>
    </S:Envelope>
--------------------------------------
五月 02, 2016 6:01:02 下午 org.apache.cxf.services.webServiceImpl.WebServiceImplPort.IWebServiceDemo
信息: Outbound Message
---------------------------
ID: 3
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: 
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
            <ns2:sayHelloResponse xmlns:ns2="http://ws.cn.xp.com/">
                <return>你好xpMon May 02 18:01:02 CST 2016</return>
            </ns2:sayHelloResponse>
     </soap:Body>
</soap:Envelope>
--------------------------------------
第一个ID对应的信息是调用消息sayHello,调用参数是xp
第二个ID对应的是响应消息sayHelloResponse,响应类容是你好xpMon May 02 18:01:02 CST 2016
如果访问服务端不存在的服务,如在浏览器输入服务返回:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Server</faultcode>
            <faultstring>
                No binding operation info while invoking unknown method with params unknown.
            </faultstring>
       </soap:Fault>
    </soap:Body>
</soap:Envelope>
服务端抛出异常:
org.apache.cxf.interceptor.Fault: No binding operation info while invoking unknown method with params unknown.
	at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:59)
	at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)

表明不存在该服务


可见soap消息格式如下:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Header>
  ...
  ...
</soap:Header>

<soap:Body>
  ...
  ...
  <soap:Fault>
    ...
    ...
  </soap:Fault>
</soap:Body>

</soap:Envelope>

一条 SOAP 消息就是一个普通的 XML 文档,含下列元素:
必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
可选的 Header 元素,含头部信息,可选的 SOAP Header 元素可含有关 SOAP 消息的应用程序专用信息(比如认证、支
付等)。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。
必需的 Body 元素,含所有的调用和响应信息
可选的 Fault 元素,提供有关在处理此消息所发生错误的信息













© 著作权归作者所有

xpttxsok
粉丝 7
博文 187
码字总数 109478
作品 0
徐汇
程序员
私信 提问
【CXF】- 拦截器 Interceptor

CXF拦截器 拦截动态操作请求和响应数据 拦截器分类 位置:服务器端拦截器,客户端拦截器 消息方向:入拦截器 出拦截器 定义者:系统拦截器 自定义拦截器:LoggingInInteceptor ①:创建webse...

ZeroneLove
03/02
24
0
webservice 客户端、服务端程序

webservice:主要实现跨平台的web数据通信 作用:假设存在两个业务系统,一个使用C++编写,另外一个使用Java语言编写,如果要实现两个不同的业务系统之间的数据通信就必须进行跨平台处理,互联...

ZeroneLove
03/02
62
0
web service基础

一:什么是 Web Service ? 一言以蔽之:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他...

天马行空的鱼
2015/12/08
60
0
soapUI工具使用方法、简介、接口测试

一、soapUI简介 SOAP: WebService通过Http协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息头的内容格式,这些特定的...

xiaomin0322
2018/12/05
162
0
WebService工作原理以及SOAP简介

1.整体结构 2.一个Web Service客户端,顾名思义是和一个Web Service服务器进行交互。 下面是一个Web Service客户端调用Web Service的基本过程。 --> 构造SOAP请求消息(将本地数据对象转换为...

杭州_周陶忠
2013/09/10
804
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 不要在领导修风扇的时候打开电扇

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :《Whats Up》 主唱妹子 Lina Perry 的嗓音实在太有力了,收放自如的自信才能唱出这么优秀的歌吧!#今日歌曲推荐# 《Whats Up》-...

小小编辑
今天
11
0
SpringBoot集成Elasticsearch并进行增删改查操作

一、创建工程 使用IntelliJ创建SpringBoot工程 SpringBoot版本为2.0.4 ElasticSearch为5.6.10 删掉蓝框中的文件(如上) 最后我们的目录结构(如下) 下面pom文件主要修改的是把spring boot从Int...

一字见心
今天
5
0
x001-版本介绍

python版本介绍 目前有2 和 3 有很多企业用的代码是2版本,随着技术的发展,以后用3的会成为大趋势 python3的安装 yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-d...

侠客行之石头
今天
5
0
聊聊rocketmq的TransientStorePool

序 本文主要研究一下rocketmq的TransientStorePool TransientStorePool rocketmq-all-4.6.0-source-release/store/src/main/java/org/apache/rocketmq/store/TransientStorePool.java publi......

go4it
昨天
6
0
笔记

场外借贷, 质押 ,托管, 永续合约. 场外借贷,n签合同. 新功能 证券交易组负责中信证券机构及个人投资交易相关系统,服务机构及个人投资客户, 涉及到两融、期权、 期货、做市等境内境外创新业...

MtrS
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部