zoukankan      html  css  js  c++  java
  • Spring+XFire WSSecurity安全认证开发感悟

         这几天因为需要使用Web Service,同事也介绍用appfuse可以生成框架,因此花了一些时间学习这个框架。使用appfuse生成的框架使用到的技术实在太多了,而且都是一些非常好的开源项目。有一部分在以前的项目中有用过,但是大部分都是没有用过的。

         以前开发Web Service都是通过AXIS来实现的,在其上安全校验等使用的比较少。最近这个项目想加上SSL认证等。在这个框架中使用XFire来实现,但是,在网上关于XFire的电子书比较少,在User Guider中信息好像也不是很全。特别是对于新手来说,更是如此。我就花了将近一个礼拜的时间才弄明白一点。走了很多的弯路。

         在网上找到一篇关于Spring+XFire实现Web Service的文章,是《精通Spring 2.x——企业应用开发详解》这本书的第十六章的内容。看过第一遍,然后照着其中的例子开发自己的Web Service例子,开始几个都比较顺利,但也有遇到问题的,下面就我开发中遇到的问题以及解决方案进行描述,希望对其他要学习这方面内容的朋友们有所帮助,也是自己的一个总结。

    配置文件配置错误

         这个错误是比较低级的,但是也是需要注意的,在照着例子编写的时候,不能把配置文件的内容写错了。我遇到的一个问题就是提示Invalid Operation错误,后来发现是没有配置wss4jInHandlerEnc时,属性名称decryptionPropFile写成encryptionPropFile了。

    NamespaceURI cannot be null错误

         根据这个错误在网上查找解决方案,相关的内容比较少。

         在http://markmail.org/message/2scmdhiwoumg6kfm中提到了解决方案,但是不是很明确,他是这么回答的:

    I found in the forum that another user had this problem but no answer was given.

    I have found that it is an issue with incompatible jars (or jars not
    in the right order in the classpath), but i haven't found which one
    yet.

    I just wanted to share that with everyone :-)

          其实这里提到了关键点,但是容易被误导,我就将jdk的jar包换到最后,放到中间。来回换了好几次都是没有效果。后来进入调试模式下,单步跟踪,可以打出异常堆栈,但是还是不能解决。

         在另外一个网站(http://www.blogjava.net/openssl/archive/2006/08/08/xfire_wss4j.html)上有人问这个问题,他们的回答如下:

    # re: [原创]实施WebService Security[WS-Security1.0]的Encrypt和Sign模式(XFire+WSS4J) 2007-05-31 08:59 yanghuw 
    我写Client代码调用时为什么抛出异常,说NamespaceURI cannot be null.  回复  更多评论    

    # re: [原创]实施WebService Security[WS-Security1.0]的Encrypt和Sign模式(XFire+WSS4J) 2007-06-01 18:27 王金拄 
    可能是你的服务端设置了命名空间而客户端没有设置命名空间。 
    要把服务端和客户端都的命名空间设置成相同的。或者都用默认的  回复  更多评论  

         我又想是否因为配置文件中需要设置namespace的属性呢?在XFire中定义WebService时,确实可以指定namespace属性,到目前为止我还不知道这个属性的用途。但是设置了这个属性之后,还是没有效果。

         后来想到在XFire的example中有一个ws-security包,其中是一些例子,其中也有2Way的例子。加载到工程中,测试例子程序可以成功,区别只在于xfire的例子不是和Spring绑定的。后来又想是不是因为我是JDK1.6导致的呢?但是安装了JDK1.5之后,用JDK1.5运行,测试,却报另外一个错误了:Provider com.bea.xml.stream.MXParserFactory not found为什么在JDK1.6中就不用找这个类呢?后来在网上找到一篇文章,是关于如何解决bea类的问题的。网址为:http://lei-alf1981.javaeye.com/blog/100731,下载jsr173之后,将其中的jsr173_1.0_ri.jar包加入到工程中,测试通过了。我再切换回1.6,还是原来的那个错误。后来发现在工程的lib中有很多jar文件没有出现在WEB-INF\lib中出现。重新对照一遍,将xfire\lib中所有的jar文件都加到工程中,再运行测试程序就没有问题了。切换会1.5,去掉jsr173_1.0._ri.jar文件,测试也成功。

    总结

          在学习过程中经常会遇到一些奇怪的问题,有时是一些小问题,却会让你花上好几天的时间才能找到解决方案,找到方案后发现原来这么简单,或者为什么我没有一开始就注意这个问题呢?反正就是要细心。出现上面的错误,还是因为jar文件没有加载全,跟顺序我觉得应该没有关系。

         在某些实现类没有出现在classpath中,java的factory模式自动寻找Factory来实现,当应该在classpath中的类没有出现时,可能会找不到默认的,也可能找到了其他的文件。1.5-应该是寻找bea的MXparserFactory,找不到。在1.6中,在rt.jar文件中有实现类,但是不允许namespaceURI为空。因此出现了上面的问题。

  • 相关阅读:
    zoj 1239 Hanoi Tower Troubles Again!
    zoj 1221 Risk
    uva 10192 Vacation
    uva 10066 The Twin Towers
    uva 531 Compromise
    uva 103 Stacking Boxes
    稳定婚姻模型
    Ants UVA
    Golden Tiger Claw UVA
    关于upper、lower bound 的探讨
  • 原文地址:https://www.cnblogs.com/liwp_Stephen/p/1271742.html
Copyright © 2011-2022 走看看