`
cenwenchu
  • 浏览: 165350 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

WS-Security 中文问题&Stax(Streaming API for XML) (二)

阅读更多
 
WS-Security中文问题解决
       在对新一代的Jaxp做了基本学习以后,那么对于axis2如何处理SOAP消息有了基本的了解,在跟踪了代码调试以后,发现问题主要是出在axis2的rampart模块的Axis2Util类,其中的两个方法getDocumentFromSOAPEnvelope(SOAPEnvelope env, boolean useDoom)和getSOAPEnvelopeFromDOMDocument(SOAPEnvelope env, boolean useDoom)。在有WS-Security和没有的不同情况下,传入的参数useDoom为true和false,导致走了两个不同的解析流程。当useDoom为true的时候,axis2通过SOAPEnvelope对象和axis2的Streaming parser来解析和构建Dom Document。当useDoom为false的时候,首先将SOAPEnvelope对象读入字节数组流,然后在根据Stax工厂生成实例,并且构造出StAXSOAPModelBuilder,然后返回通过StAXSOAPModelBuilder获得的Dom Document对象。
       察看了一下调用者传入参数的地方,其实是通过MsgContext的参数配置来确定采取什么策略,因此只需要将axis2.xml中配置增加一个parameter,设置useDoom为true即可。或者就是做一个handle或者phase在Inflow和outflow中配置这个参数即可。
       搞了那么久也就是修改一个配置,如果光从结果看,花了两天时间真是比较浪费,但是如果从过程来看,那么这两天时间所学到的那还是比较值的。
       由于第二天是周日,问题解决了也就没有再继续细究。但是周日早晨晨跑的时候,给自己列了三个疑问,首先为什么走系统获取的Stax会有问题,再则如果我用sun的jaxp实现来替换是否能够解决此问题而不需要配置useDoom。useDoom两种处理模式究竟有什么区别。
 
问题的再次细究
       周一上班的时候还是记得周日早晨提出的三个问题,因此就仔细的再分析了一下这三个问题。
首先是采取sun的jaxp替换,这个实现在sun的jwsdp中已经包含了,替换以后然后强制在jre的配置文件中指定使用,出现了异常,看来直接使用还不行,需要针对一些参数作配置,特别是对namingspace的解析,同时也没有花更多时间去细研究。
再则,仔细回想了一下我在定位这个问题的时候做的实验,我曾经试图将中文先用Base64编码,然后服务端接收到以后回传,客户端再用Base64解码,没有任何问题。有时候换一个中文或者中文前后有字母数字,也可以正常处理,同时在跟踪代码过程中看过SOAP消息中的内容,内容是乱码。这让我有点启发,例如我输入参数为“岑文初”每次始终都会出错,如果输入为“岑文”,就没有问题,看了看内存内的变量,发现,原来如果是“岑文初”的时候SOAP消息中的标签封闭被破坏,如果是“岑文”,虽然是乱码,但是没有破坏标签的封闭。
仔细看了看上次提到的两个流程,其实两个流程除了parser不同以外,对于SOAPEnvelope的处理也是不一样的,走UseDoom的是直接将分析好的Dom对象返回,不做附加的处理,只是根据Envelope生成了SOAP的解析器以及配置了Stax的Cursor的两个接口实现类。不走UseDoom的情况则是完全将SOAPEnvelope再次序列化并且通过外部的Stax实现来解析和处理,但是问题就出在对象到字节流的序列化过程,默认的是使用了SOAP规定的utf-8编码方式,因此在这个过程中有些中文的内容就破坏了SOAP的消息包XML的标签合法性,导致外部解析器分析出现问题。如果将传入和传出的中文都编码成utf-8没有任何问题。
问题总结就是其实根源在于对于内容中的中文字符编码时采用Utf-8破坏了xml的封闭性,而我开始采用的useDoom正好规避了这个过程,也就自然通过了。但是就其设计本身来说,rampart应该是赞同使用useDoom为false的方式,这才是真正的Stax的模式,同时有很好扩展性。另一方面个人觉得类似于这种抽象工厂机制来说,最好不要在系统变量或者jre中强制指定,这样会导致一些意想不到的问题,虽然是规范,但是细节实现毕竟有差异,因此一些特殊的开源框架的一些莫名其妙的xml解析问题也常常由于这些引起。
 
几点感悟
       灵活的SPI(Service Provider Interface)模式是当前框架设计以及底层设计的必要特质,开放才会发展得更好。
       灵活是把双刃剑,在遇到一些灵活的框架设计时,首先必须了解其原理和结构,然后根据实践来验证问题的缘由。
       抽象工厂还是有适用场景的,类似于JaxpSCA等框架的实现,抽象工厂以及利用JarMETA-INF/services来载入SPI的实现是IOC的一种很好的补充。 
分享到:
评论

相关推荐

    ws-security 和wss4j的jar包

    3. **wss4j-ws-security-stax.jar**:STAX(Streaming API for XML)版本的实现,适用于处理大型XML文档,以提高性能。 4. **wss4j-bindings.jar**:包含了与不同Web服务框架(如CXF、Axis2等)的绑定和集成代码。 5...

    jaxws java webservice需要的jar包

    7. **stax-api.jar** 和 **woodstox-core-asl.jar**:STAX(Streaming API for XML)是Java中处理XML流的API,Woodstox是它的高性能实现,用于XML的读写操作。 8. **activation.jar** 和 **javax.mail.jar**:这两...

    axiom-api-1.2.2.jar.zip

    其优势在于能够处理复杂的XML结构,支持XPath和XSLT,以及对StAX(Streaming API for XML)的原生支持,这使得处理大量XML数据时性能显著提升。此外,AXIOM API还支持WS-Addressing和WS-Security等Web服务标准,使得...

    xml api reference

    - **StAX Support**: 提供了StAX (Streaming API for XML) 支持,适用于处理大型XML文档。 - **Web Services Integration**: 可以与Web服务无缝集成,支持SOAP消息处理和WS-*协议栈。 - **Security Features**: 包括...

    jaxws-ri2.3.zip

    6. **stax-api.jar** 和 **Woodstox.jar**: 提供了Streaming API for XML (StAX)的实现,用于高效地读写XML文档。 7. **其他的依赖库**: 可能包括了如JAXB(Java Architecture for XML Binding)等与XML绑定相关的库...

    精通Spring_2.x:企业应用开发详解(xfire部分).doc

    它采用了STAX(Streaming API for XML)流模型处理SOAP消息,相较于DOM模型,STAX能更高效地处理大型XML文档。XFire还提供了丰富的API,便于开发者快速构建和部署Web Service。 - **XFire特性**:XFire支持多种Web ...

    Jax-webservice.rar

    4. **stax-api.jar** 和 **Woodstox.jar**: STAX(Streaming API for XML)是一个低级别的XML解析器,提供了一种流式处理XML文档的方式。Woodstox是STAX的一个高性能实现,常用于处理大量XML数据。 5. **activation...

    Java XML和Web服务宝典

    在Java中,SAX(Simple API for XML)、DOM(Document Object Model)和StAX(Streaming API for XML)是解析XML的主要方式,各有优缺点,需要根据实际需求选择合适的方法。此外,JAXB(Java Architecture for XML ...

    jaxws-ri.rar

    6. **stax-api.jar** 和 **woodstox-core-asl.jar**:这些是Streaming API for XML (StAX) 和Woodstox XML处理器的实现,用于高效地处理XML输入和输出。 7. **metro-config.jar** 和 **policy.jar**:与配置和策略...

    Apache CXF文件目录结构及需要jar包

    - `stax-api.jar` 和 `stax2-api.jar`:支持Streaming API for XML(StAX)处理。 - `xmlsec.jar`:XML加密和签名库,用于WS-Security相关功能。 - `commons-logging.jar` 和 `log4j.jar`:日志记录库,CXF使用...

    cxf-jar包.rar

    1. **woodstox-core-asl-4.4.1.jar**: Woodstox是一个高性能的XML处理库,它提供了对StAX(Streaming API for XML)的实现。在CXF中,Woodstox用于快速解析和生成XML,以提高Web服务处理速度和效率。 2. **cxf-rt-...

    cxf3.2.0 webservice 最少jar包

    - `stax-api.jar` 和 `stax2-api.jar`:提供 Streaming API for XML 的支持。 - `木材框架的其他相关依赖,如log4j.jar,用于日志记录。 这些JAR包组合在一起,足以让CXF 3.2.0作为基本的Web服务服务器或客户端运行...

    webservice的jar包

    5. **stax-api.jar**和**stax-impl.jar**:Streaming API for XML,用于高效地读取和写入XML文档。 6. **jaxp-ri.jar**:Java API for XML Processing,是处理XML文档的基础,包括DOM、SAX和XSLT。 7. **wsit-api....

    Java的webservice需要的axis2的所有jar包

    - `geronimo-stax-api_1.0_spec.jar`: 提供STAX(Streaming API for XML)的规范实现,用于XML解析。 - `saaj-api.jar`和`saaj-impl.jar`: SAAJ(SOAP with Attachments API for Java)用于处理SOAP消息和附件。 ...

    apache-cxf-3.1.18.zip

    6. **依赖库**:CXF可能依赖于其他第三方库,如JAXB(Java Architecture for XML Binding)、StAX(Streaming API for XML)等,这些依赖库也会包含在压缩包中。 使用Apache CXF的主要优点包括: - **易于使用**:...

    简单的WebService

    - `stax-api-1.0.1.jar` 和 `wstx-asl-3.2.0.jar`:STAX(Streaming API for XML)是处理XML的事件驱动API,Wstx-asl是Woodstox的一部分,是一个高效的STAX实现。 综上所述,这篇关于“简单的WebService”的博文...

    webService教程

    这些标准使得XFire能够更好地处理XML解析,提高了性能,尤其是在采用Stax(Streaming API for XML)解释XML时,通过Woodstox库进一步增强了性能。此外,XFire的易用性和与Spring框架的集成使得从Plain Old Java ...

    Web Service开发指南.pdf

    - XFire通过Stax(Streaming API for XML)提供了高效的XML解析和生成,提高了性能。 4. CXF框架: - CXF是目前最活跃的Java Web服务框架之一,由XFire和Apache SOAP项目合并而成。 - CXF不仅支持SOAP,还支持...

    java调用.net webservice时所需的jar包

    - `stax-api.jar` 和 `stax.jar`: 支持 Streaming API for XML(StAX),用于XML的解析和生成。 - `jaxb-api.jar`, `jaxb-impl.jar`, `jaxb-core.jar`: JAXB(Java Architecture for XML Binding)是Java中用于XML...

    axis2客户端所需要的所有jar包

    12. **stax-api.jar, stax2-api.jar, woodstox-core-asl.jar**: Streaming API for XML (StAX) 库,提供高效的XML解析和生成。 这些jar包组合起来,构成了一个完整的Axis2客户端环境,可以有效地生成、配置和服务...

Global site tag (gtag.js) - Google Analytics