xfire webService發佈以及客戶端調用(帶驗證頭)

一、先來說webservice服務端
結構圖如下:
這裏寫圖片描述
1.添加jar包(放入WEB_INF下的lib目錄)(如圖)
這裏寫圖片描述
2.編寫一個需要發佈的接口(IHelloWebService)

package com.webservice;

import javax.jws.WebService;

@WebService 
public interface IHelloWebService {  
    /** 
     * example 
     * @param message 
     * @return 
     */  
    public String example(String message);  

}  

3.對接口的實現

package com.webservice;

import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService(endpointInterface="com.webservice.IHelloWebService")  
public class HelloWebServiceImpl implements IHelloWebService {  

    public String example(String message) {  
        //處理邏輯
        return "Webservice 服務器返回的信息:"+message;  
    }  


}  

4.驗證頭的服務端(Handler)

package com.webservice.checkclient;

import org.apache.log4j.Logger;  
import org.codehaus.xfire.MessageContext;  
import org.codehaus.xfire.exchange.InMessage;  
import org.codehaus.xfire.fault.XFireFault;  
import org.codehaus.xfire.handler.AbstractHandler;  
import org.jdom.Element;  
import org.jdom.Namespace;  


/**  
* Server端的認證模塊,回調處理模塊 
* @author Administrator 
*/  
public class ServerAuthenticationHandler extends AbstractHandler {  
    private static final Logger log = Logger.getLogger(ServerAuthenticationHandler.class);  

    public void invoke(MessageContext context) throws Exception {  


        if (context.getInMessage().getHeader() == null) {  
            throw new org.codehaus.xfire.fault.XFireFault("請求必須包含驗證信息",  
                    org.codehaus.xfire.fault.XFireFault.SENDER);  
        }  
        Element token = context.getInMessage().getHeader().getChild(  
                "AuthenticationToken");  
        if (token == null) {  
            throw new org.codehaus.xfire.fault.XFireFault("請求必須包含身份驗證信息",  
                    org.codehaus.xfire.fault.XFireFault.SENDER);  
        }  
        String username = token.getChild("Username").getValue();  
        String password = token.getChild("Password").getValue();  

        /** 
         * 檢查用戶名密碼是否正確 
         */  
        PasswordAuthenticationManager manager=new PasswordAuthenticationManager();  
        if(!manager.verify(username,password))  
            throw new XFireFault("用戶名密碼錯誤,請重新確認",  
                    XFireFault.SENDER);  


    }  
}  

5.編寫驗證用戶名密碼的具體方法

package com.webservice.checkclient;

public class PasswordAuthenticationManager {
    public  boolean verify(String username,String password){  
        boolean flag=false;  
        if("aaa".equals(username)&&"111".equals(password)){  
            flag=true;  
        }  
        return flag;  
    }  
}

6.寫services.xml文件(在WebRoot下META-INF新建xfire文件夾放入services.xml文件)

<?xml version="1.0" encoding="UTF-8"?>  
<beans>  

    <service xmlns="http://xfire.codehaus.org/config/1.0">  
        <name>HelloWebService</name>  
        <serviceClass>  
            com.webservice.IHelloWebService  
        </serviceClass>  
        <implementationClass>  
            com.webservice.HelloWebServiceImpl  
        </implementationClass>  


        <!--註冊監聽處理器(server端的handler)-->    
        <inHandlers>    
        <handler                         handlerClass="com.webservice.checkclient.ServerAuthenticationHandler"></handler>    
        </inHandlers>   

        <style>wrapped</style>  
        <use>literal</use>  
        <scope>application</scope>  
    </service></beans>  

7.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

   <servlet>
        <servlet-name>XFireServlet</servlet-name>
        <servlet-class>
            org.codehaus.xfire.transport.http.XFireConfigurableServlet
        </servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>XFireServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

</web-app>

8.server端的main方法(測試是否發佈成功)

package com.webservice;

import javax.xml.ws.Endpoint;

public class TestMain {
      public static void main(String[] args){
            //參數1:綁定服務的地址
            //參數2:提供services的實例
         Endpoint.publish("http://127.0.0.1:8080/webServer/services/HelloWebService", new HelloWebServiceImpl());
       //url的services是在web.xml中配置的路徑
       //url的HelloWebService是與name(services.xml)對應的
       System.out.println("WebService服務啓動");

       }
}
9.在瀏覽器地址欄輸入http://127.0.0.1:8080/webServer/services/HelloWebService?wsdl(顯示xml格式的document則發佈成功)

二、客戶端調用
1.客戶端的驗證handler

package com.webservice;

import org.apache.log4j.Logger;  
import org.codehaus.xfire.MessageContext;  
import org.codehaus.xfire.handler.AbstractHandler;  
import org.jdom.Element;  
/**  
* @author Administrator 
*/  
public class ClientAuthHandler extends AbstractHandler {  


    private static final Logger log = Logger.getLogger(ClientAuthHandler.class);   
    private String username;  
    private String password;  

    public void invoke(MessageContext arg0) throws Exception {  
            Element el = new Element("header");   
            arg0.getOutMessage().setHeader(el);   
            Element auth = new Element("AuthenticationToken");   
            Element username_el = new Element("Username");   
            username_el.addContent(username);   
            Element password_el = new Element("Password");   
            password_el.addContent(password);   
            auth.addContent(username_el);   
            auth.addContent(password_el);   
            el.addContent(auth);   

    }  


    public String getUsername() {  
        return username;  
    }  

    public void setUsername(String username) {  
        this.username = username;  
    }  

    public String getPassword() {  
        return password;  
    }  

    public void setPassword(String password) {  
        this.password = password;  
    }  
}  

2.通過Web服務端提供的接口來創建客戶端

package com.webservice;
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;  
import java.net.URL;
import java.util.List; 

import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;  
import org.codehaus.xfire.service.Service;  
import org.codehaus.xfire.service.binding.ObjectServiceFactory;  

/** 
 * 通過Web服務端提供的接口來創建客戶端 
 */  
public class ClientFromInterface {  
    public static void main(String[] args)throws Exception{   
        Service serviceModel = new ObjectServiceFactory().create(IHelloWebService.class);  

        //訪問的地址  
        String serviceURL = "http://127.0.0.1:8080/webServer/services/HelloWebService";  
        ClientAuthHandler wscname   =   new ClientAuthHandler();  
        wscname.setUsername("aaa");  
        wscname.setPassword("111");  


        //爲XFire獲得一個代理工廠對象   
        XFireProxyFactory factory = new XFireProxyFactory();  

        //通過proxyFactory,使用服務模型serviceModel和服務端點URL(用來獲得WSDL)  
        //得到一個服務的本地代理,這個代理就是實際的客戶端  
        IHelloWebService client = (IHelloWebService)factory.create(serviceModel, serviceURL);  
        XFireProxy proxy = (XFireProxy) Proxy.getInvocationHandler(client);  
        Client clientOne = proxy.getClient(); 
        clientOne.addOutHandler(wscname); 

        String serviceResponse = client.example("SayHello");  
        System.out.println(serviceResponse);  


    }  
}  

正常輸出,調用成功
———————————————-END
Attention:(總結一下遇到的幾個問題)
1.如果出現class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist
修改方法:把META-INF文件夾整個copy到工程的build的classes目錄下。
2.出現異常org.springframework.beans.factory.BeanDefinitionStoreException: Unrecognized xbean namespace mapping: http://XFire.codehaus.org/config/1.0 (兩種修改方案)
1、

<beans  xmlns="http://xfire.codehaus.org/config/1.0>  
    <service">  
</beans>

換爲(以下的代碼爲本文的寫法)

<beans>  
    <service xmlns="http://xfire.codehaus.org/config/1.0">  
</beans>

2、 xmlns=”http://xfire.codehaus.org/config/1.0 “> 應該是全部小寫。
3、Caused by: org.codehaus.xfire.XFireRuntimeException: Couldn’t create type for property authResRoleId on class com.ultrapower.ams.service.resaccount.appaccimpl.AppResAccount: Cannot create mapping for java.util.Set, unspecified component type for interface java.util.Set
解決辦法:
webservice對外接口IHelloWord的方法參數只能是通用類型,(String,Int等類型)
(以上demo若有相似之處,是搜索得來,謝謝支持)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章