XFIRE的身份验证

XFire提供了四种身份验证的方式,分别是http验证,JSR181,Handler验证,WS-Security。

SOAP的原理告诉我们一个WS交互的流程是客户端发送请求->服务器接收请求->服务器发送数据->客户端接收数据,handler可以让我们在这四个操作中之前进行编码,所以,我们的验证进行在客户端发送请求和服务器接收请求的时候,因此,我们要写两个handler,然后把它们装配上就可以了。

Handler验证方式如下:

主要参考的实例是XFIREdemo中的BOOK

服务器的代码如下
  1. package org.codehaus.xfire.demo.handlers;   
  2.   
  3. import org.codehaus.xfire.MessageContext;   
  4. import org.codehaus.xfire.XFireRuntimeException;   
  5. import org.codehaus.xfire.handler.AbstractHandler;   
  6. import org.jdom.Element;   
  7. import org.jdom.Namespace;   
  8.   
  9. /**  
  10.  * @author <a href="mailto:[email protected]">Tomasz Sztelak</a>  
  11.  *   
  12.  * Retrive service version from SOAP header.  
  13.  */  
  14. public class CheckVersionHandler extends AbstractHandler {   
  15.   
  16.     private static final String VERSION_TAG = "version";   
  17.   
  18.     private static final String VERSION_NS = "http://xfire.codehaus.org/Book";   
  19.   
  20.     public void invoke(MessageContext ctx) throws Exception {   
  21.         // Check if header exists   
  22.         Element header = ctx.getInMessage().getHeader();   
  23.         if (header == null) {   
  24.             throw new XFireRuntimeException("Missing SOAP header");   
  25.         }   
  26.         // Does it have version tag   
  27.         Element version = header.getChild(VERSION_TAG, Namespace   
  28.                 .getNamespace(VERSION_NS));   
  29.         if (version == null) {   
  30.             throw new XFireRuntimeException("Missing version header");   
  31.         }   
  32.   
  33.         ctx.setProperty("ServiceVersion", version.getText());   
  34.     }   
  35.   
  36. }   
客户端的代码
  1. package org.codehaus.xfire.demo.handlers;   
  2.   
  3. import org.codehaus.xfire.MessageContext;   
  4. import org.codehaus.xfire.handler.AbstractHandler;   
  5. import org.jdom.Element;   
  6.   
  7. /**  
  8.  *  @author <a href="mailto:[email protected]">Tomasz Sztelak</a>  
  9.  *  
  10.  * Add version info to SOAP header.  
  11.  */  
  12. public class OutHeaderHandler extends AbstractHandler {   
  13.        
  14.     private static final String VERSION_TAG = "version";   
  15.   
  16.     private static final String VERSION_NS = "http://xfire.codehaus.org/Book";   
  17.   
  18.     public void invoke(MessageContext ctx) throws Exception {   
  19.            
  20.         Element header = ctx.getOutMessage().getOrCreateHeader();   
  21.         header.addContent(new Element(VERSION_TAG ,VERSION_NS).addContent("1.0"));   
  22.            
  23.     }   
  24.   
  25. }   

 

然后需要在services.xml中配置如下:

xml 代码
  1. <!-- START SNIPPET: services -->  
  2. <beans xmlns="http://xfire.codehaus.org/config/1.0">  
  3.   <service>  
  4.     <name>BookService</name>  
  5.     <namespace>http://xfire.codehaus.org/BookService</namespace>  
  6.     <serviceClass>org.codehaus.xfire.demo.BookService</serviceClass>  
  7.     <implementationClass>org.codehaus.xfire.demo.BookServiceImpl</implementationClass>  
  8.     <inHandlers>  
  9.      <handler handlerClass="org.codehaus.xfire.demo.handlers.CheckVersionHandler" />  
  10.     </inHandlers>  
  11.   </service>  
  12. </beans>  
  13. <!-- END SNIPPET: services -->  
这样一来,使用这个原理就可以针对特定用户进行服务调用了。

你可能感兴趣的:(xml,webservice,MyEclipse,SOAP,Gmail)