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. }    
import java.util.Iterator;  
import org.apache.axiom.om.OMElement;  
import org.apache.axis2.AxisFault;  
import org.apache.axis2.context.MessageContext;  
  
public class LoginCheck  
{  
    /** 
     * 〈一句话功能简述〉 〈功能详细描述〉 
     *  
     * @throws AxisFault 
     */  
    public static void checkUserPwd() throws AxisFault  
    {  
        MessageContext msgContext = MessageContext.getCurrentMessageContext();  
        // 获取Head  
        Iterator list = (Iterator) msgContext.getEnvelope().getHeader()  
                .getFirstElement().getChildren();  
        String Username = "";  
        String Password = "";  
        while (list.hasNext())  
        {  
            OMElement element = (OMElement) list.next();  
            if (element.getLocalName().equals("Username"))  
            {  
                Username = element.getText();  
            }  
            if (element.getLocalName().equals("Password"))  
            {  
                Password = element.getText();  
            }  
        }  
        if (!Username.equals("toone") || !Password.equals("111111"))  
        {  
            throw new AxisFault(  
                    " Authentication Fail! Check username/password ");  
        }  
    }  
}  

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

  1. //当客户端调用该方法时,在此处先进行用户名和密码校验,如果校验通过则继续后续逻辑处理,如果不通过则抛出异常。     
  2.    LoginCheck.checkUserPwd();     
//当客户端调用该方法时,在此处先进行用户名和密码校验,如果校验通过则继续后续逻辑处理,如果不通过则抛出异常。   
   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. }     
import org.apache.axiom.om.OMAbstractFactory;   
import org.apache.axiom.om.OMElement;   
import org.apache.axiom.om.OMFactory;   
import org.apache.axiom.om.OMNamespace;  
  
public class HeaderOMElement {   
 /** 
 * 〈一句话功能简述〉 
 * 〈功能详细描述〉  
 *  @return     
*/  
public static OMElement createHeaderOMElement(){   
  OMFactory factory = OMAbstractFactory.getOMFactory();   
     OMNamespace SecurityElementNamespace = factory.createOMNamespace("http://handler.com","wsse");   
        OMElement authenticationOM = factory.createOMElement("Authentication",   
                SecurityElementNamespace);   
        OMElement usernameOM = factory.createOMElement("Username",   
                SecurityElementNamespace);   
        OMElement passwordOM = factory.createOMElement("Password",   
                SecurityElementNamespace);   
        usernameOM.setText("toone");   
        passwordOM.setText("111111");   
        authenticationOM.addChild(usernameOM);   
        authenticationOM.addChild(passwordOM);   
        return authenticationOM;   
 }   
}   

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

这里也给出代码参考:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值