Axis2+SOAP Header简单的验证方法实践

服务端

服务端就要在每个方法里面加上解析SOAP Header,并进行安全校验的代码即可,记住,是每一个方法里面都加,是everyone

虽然是每一都需要添加校验代码,但庆幸的是,校验过程都是一致的,实现一个通用的方法,每次调用就行。

这里给出一个校验方法的代码:

  1. import java.util.Iterator;    
  2. import org.apache.axiom.om.OMElement;    
  3. import org.apache.axis2.AxisFault;    
  4. import org.apache.axis2.context.MessageContext;    
  5.     
  6. public class LoginCheck    
  7. {    
  8.     /**  
  9.      * 〈一句话功能简述〉 〈功能详细描述〉  
  10.      *   
  11.      * @throws AxisFault  
  12.      */    
  13.     public static void checkUserPwd() throws AxisFault    
  14.     {    
  15.         MessageContext msgContext = MessageContext.getCurrentMessageContext();    
  16.         // 获取Head    
  17.         Iterator list = (Iterator) msgContext.getEnvelope().getHeader()    
  18.                 .getFirstElement().getChildren();    
  19.         String Username = "";    
  20.         String Password = "";    
  21.         while (list.hasNext())    
  22.         {    
  23.             OMElement element = (OMElement) list.next();    
  24.             if (element.getLocalName().equals("Username"))    
  25.             {    
  26.                 Username = element.getText();    
  27.             }    
  28.             if (element.getLocalName().equals("Password"))    
  29.             {    
  30.                 Password = element.getText();    
  31.             }    
  32.         }    
  33.         if (!Username.equals("toone") || !Password.equals("111111"))    
  34.         {    
  35.             throw new AxisFault(    
  36.                     " Authentication Fail! Check username/password ");    
  37.         }    
  38.     }    
  39. }    

 之后在服务中的每个方法里面加上一句代码,只要一句就行:

  1. //当客户端调用该方法时,在此处先进行用户名和密码校验,如果校验通过则继续后续逻辑处理,如果不通过则抛出异常。     
  2.    LoginCheck.checkUserPwd();     

服务端就这么简单,下面再说说客户端。


客户端

客户端也不难,就是往SOAPHeader中添加相应字段就行,网上很多代码可以参考。

这里是我用到的代码:

  1. import org.apache.axiom.om.OMAbstractFactory;     
  2. import org.apache.axiom.om.OMElement;     
  3. import org.apache.axiom.om.OMFactory;     
  4. import org.apache.axiom.om.OMNamespace;    
  5.     
  6. public class HeaderOMElement {     
  7.  /**  
  8.  * 〈一句话功能简述〉  
  9.  * 〈功能详细描述〉   
  10.  *  @return      
  11. */    
  12. public static OMElement createHeaderOMElement(){     
  13.   OMFactory factory = OMAbstractFactory.getOMFactory();     
  14.      OMNamespace SecurityElementNamespace = factory.createOMNamespace("http://handler.com","wsse");     
  15.         OMElement authenticationOM = factory.createOMElement("Authentication",     
  16.                 SecurityElementNamespace);     
  17.         OMElement usernameOM = factory.createOMElement("Username",     
  18.                 SecurityElementNamespace);     
  19.         OMElement passwordOM = factory.createOMElement("Password",     
  20.                 SecurityElementNamespace);     
  21.         usernameOM.setText("toone");     
  22.         passwordOM.setText("111111");     
  23.         authenticationOM.addChild(usernameOM);     
  24.         authenticationOM.addChild(passwordOM);     
  25.         return authenticationOM;     
  26.  }     
  27. }     

然后在需要调用服务的时候,将创建得到的OMElement附加上去就行了。

这里也给出代码参考:

  1. RPCServiceClient client = new RPCServiceClient();    
  2.     
  3. // 向Soap Header中添加校验信息    
  4. client.addHeader(HeaderOMElement.createHeaderOMElement());    

其他调用的Web服务的代码参考我上一篇文章就行了,不在重复写了。



猜你喜欢

转载自blog.csdn.net/wen430821/article/details/54705873