Xfire soapHeader的WebService权限控制forjava

研究webservice有一段时间了,觉得用soapHeader来控制访问比较简单,特贴出代码以供大家分享

1.我们可以做一个很简单的ws测试,服务端的接口代码如下:

Java代码   收藏代码
  1. package ws;  
  2. //Generated by MyEclipse  
  3.   
  4. public interface HelloWord {      
  5.     public String example(String message);  
  6.       
  7. }  

 

实现类:

Java代码   收藏代码
  1. package ws.impl;  
  2.   
  3. import ws.HelloWord;  
  4. public class HelloWordImpl implements HelloWord {  
  5.       
  6.     public String example(String message) {  
  7.         System.out.println(message);  
  8.         return message;  
  9.     }     
  10. }  

 服务端的验证类:

Java代码   收藏代码
  1. import org.codehaus.xfire.MessageContext;  
  2. import org.codehaus.xfire.handler.AbstractHandler;  
  3. import org.jdom.Element;  
  4. public class AuthenticationHandler extends AbstractHandler{  
  5.   
  6.      public void invoke(MessageContext cfx) throws Exception{  
  7.          if(cfx.getInMessage().getHeader() == null)  
  8.         {  
  9.              throw new org.codehaus.xfire.fault.XFireFault("请求必须包含验证信息",org.codehaus.xfire.fault.XFireFault.SENDER);  
  10.          }  
  11.          Element token=cfx.getInMessage().getHeader().getChild("AuthenticationToken");  
  12.          if (token == null)   
  13.         {   
  14.           throw new org.codehaus.xfire.fault.XFireFault("请求必须包含身份验证信息", org.codehaus.xfire.fault.XFireFault.SENDER);   
  15.          }   
  16.             String username = token.getChild("Username").getValue();   
  17.             String password = token.getChild("Password").getValue();   
  18.             try   
  19.            {   
  20.                 //进行身份验证 ,只有test@test的用户为授权用户  
  21.                if(username.equals("test") && password.equals("test"))                
  22.                 System.out.println("身份验证通过");  
  23.                else throw new Exception();  
  24.             }   
  25.             catch (Exception e)   
  26.            {   
  27.                 throw new   org.codehaus.xfire.fault.XFireFault("非法的用户名和密码",   org.codehaus.xfire.fault.XFireFault.SENDER);   
  28.             }   
  29.      }  
  30. }  

 

这样服务端的任务就算完成,客户端调用是也需要一个授权信息,如下:

Java代码   收藏代码
  1. import org.codehaus.xfire.MessageContext;  
  2. import org.codehaus.xfire.handler.AbstractHandler;  
  3. import org.jdom.Element;  
  4.       
  5. public class ClientAuthenticationHandler extends AbstractHandler{  
  6.       
  7.      private String username = null;   
  8.      private String password = null;   
  9.   
  10.      public ClientAuthenticationHandler() { }   
  11.   
  12.      public ClientAuthenticationHandler(String username,String password) {   
  13.          this.username = username;   
  14.          this.password = password;   
  15.      }   
  16.   
  17.      public void setUsername(String username) {   
  18.          this.username = username;   
  19.      }   
  20.   
  21.      public void setPassword(String password) {   
  22.          this.password = password;   
  23.   
  24.      }   
  25.   
  26.      public void invoke(MessageContext context) throws Exception {   
  27.   
  28.          //为SOAP Header构造验证信息  
  29.          Element el = new Element("header");   
  30.          context.getOutMessage().setHeader(el);   
  31.          Element auth = new Element("AuthenticationToken");   
  32.          Element username_el = new Element("Username");   
  33.          username_el.addContent(username);   
  34.          Element password_el = new Element("Password");   
  35.          password_el.addContent(password);   
  36.          auth.addContent(username_el);   
  37.          auth.addContent(password_el);   
  38.          el.addContent(auth);   
  39.      }   
  40. }  

 

然后就是客户端的调用了,其代码如下

Java代码   收藏代码
  1. import java.net.URL;  
  2. public class HelloWorkClient {  
  3.       
  4.      public static void main(String[] args) throws  Exception {  
  5.             String wsdlUrl="http://127.0.0.1:8080/testWS/services/helloWord?wsdl";  
  6.             org.codehaus.xfire.client.Client client = new org.codehaus.xfire.client.Client(new  URL(wsdlUrl));  
  7.             <span style="color: #333333; #ffffff;">client.addOutHandler(new ClientAuthenticationHandler("abcd","1234"));</span>  
  8.             Object[] obj = client.invoke("example",new Object[]{"调用成功"});  
  9.             System.out.println(obj[0]);  
  10.   
  11.         }  
  12. }  

client.addOutHandler表示客户端调用服务端的验证码,你如果没有这行则无法调用,另外就是service.xml的配置文件必须要配置soapHeader,代码如下:

Xml代码   收藏代码
  1. <service  xmlns="http://xfire.codehaus.org/config/1.0">  
  2.         <name>helloWord</name>  
  3.         <serviceClass>ws.HelloWord</serviceClass>  
  4.         <implementationClass>ws.impl.HelloWordImpl</implementationClass>  
  5.         <inHandlers>   
  6.          <handler  handlerClass ="ws.other.AuthenticationHandler" ></handler >   
  7.          </inHandlers>  
  8.         <style>wrapped</style>  
  9.         <use>literal</use>  
  10.         <scope>application</scope>  
  11.     </service>  

 

这样,一个完整的测试权限的例子就算完成了。

你可能感兴趣的:(webservice)