Spring+XFire WS-Security安全认证开发感悟

     这几天因为需要使用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为空。因此出现了上面的问题。

posted on 2008-08-19 22:14  liwp_Stephen  阅读(4832)  评论(0编辑  收藏  举报

导航