webservices的開源組件很多,這裏我們選用的是MyEclipse集成的一個組件xfire,利用這個組件的最大好處就是配置簡單,而且功能也十分的強大。
在很多行業軟件開發中用到的都是1.4的JDK,所以要求組件一定要支持。下面我就使用xfire+weblogic 8.x 開發做一個使用介紹。
XFire是codeHaus組織提供的一個開源框架,它構建了POJO和SOA之間的橋樑,主要特性就是支持將POJO通過非常簡單的方式發佈成Web服務,這種處理方式不僅充分發揮了POJO的作用,簡化了Java應用轉化爲Web服務的步驟和過程,也直接降低了SOA的實現難度,用過xfire的朋友一定會這樣的感觸,對於xfire的基本配置及調用方式已經很多的相關文章,這裏主要對xfire的權限管理的實現做一下詳細的講解。
下面是我的包結構
首先,我們就開始講解怎樣實現一個webservice;再講解,怎樣用xfire進行用戶的權限驗證和獲取客戶端IP進行驗證;最後講解怎麼把webservices整合到我們的項目中去。
第一步:實現一個簡單的webservices
在MyEclipse裏怎麼建立一個xfire webservices工程,這個在我的資源裏有對應的視頻,如果看下面的內容看不太懂的話建議先下載視頻看看。
服務器端代碼:
利用工具生成客戶端的時候,會生成泛型來獲取參數,但在JDK1.4下並不支持泛型,於是可以採用aegis綁定方法配置
方法是在接口類同目錄下建一個文件名爲 接口類名+.aegis.xml的文件,如下
IHelloWordwebservices.aegis.xml文件如下:
其中,method代表需要配置的方法名,由於XFire可以支持基本類型,針對集合類型時,需要配置,返回類型或參數類型爲基本類型時不需要特殊配置。
<return-type/>爲配置返回類型,componentType屬性代表返回的集合中所包含的類,此類可以是自定義的對象,也可以是基本類型,例如java.lang.String
index="0"代表方法的參數的序號,0即第一個參數。 當參數爲基本類型時可以不用配置
componentType代表集合參數內包含的類型,也可以爲自定義對象
web.xml
services.xml
到此服務器端就寫完了。
部署到weblogic上,注意現在服務器配置纔剛剛開始,如果不配置的話在tomcat上可以正常運行的的,但在weblogic上就會報錯。
第一個可能的錯誤DTD解析錯誤
weblogic8.1的版本,只支持jdk1.4和servlet2.3的規範,在web.xml的配置文件中需要將Myeclipse工具默認生成的
改爲:
再啓動就不會包DTD解析錯誤了
第二個錯誤,將下載的xfire jar包導入lib,啓動weblogic可能會報QName異常,結果到官方網站又去下了個QName.jar包,解壓後把qname.class文件覆蓋到weblogic路徑 d:/bea/weblogic81/server/lib中有個weblogic.jar包,解壓後可以看到javax.xml.namespace文件夾下也有個QName.class,我把這兩個class反編譯後看到原來weblogic.jar中的這個類的放在QName.jar包中都有,所以把QName.jar包中的QName.class覆蓋過去,QName Exception排除
第三:在Xfire1.2.6類中有依賴到spring包中的類,所以xfire還需要spring-1.2. 6和xben-spring-2.8的jar包,不然會報springframework的異常錯誤,因爲services.xml文件中節點的讀取需要依賴spring。(這個在建立工程的時候選擇xfire 1.2Core 和心包時裏面已經包含了spring的兩個包,所以這個問題一般不會遇到,遇到的話就看看xfire 1.2Core 裏有沒包含,沒有的話再加進去就ok了)
最後注意用JDK1.4編譯運行哦。
到此服務器全部搞定,在ie輸入http://127.0.0.1:7001/webservices/services/Interface?wsdl就可以訪問了哦,顯示xml結構頁面說明接口訪問成功。
客戶端的開發
現在開始客戶端的開發,客戶端可以利用xfire wsdl 的url來生成,但生成的默認文件使用的是泛型,我們的JDK1.4是不支持的,所以最好還是手動的編寫客戶端吧,代碼如下:
客戶端編寫完成,注意把客戶端jar包導入到lib,所有jar包在我的資源了下載
XFire 通過 繼承AbstractHandler 實現安全驗證
WebSerice是一種開放的web服務,任何人都可以訪問,但我們有時候需要考慮只有付費用戶才能使用WS,所以,我們就需要對WS加入安全驗證機制,當然,可以利用防火牆的IP過濾,web應用的配置從最外層去隔離非法用戶,但在內層,我們也可以使用SOAP Header的方式,由客戶端發送驗證數據,服務端驗通過後基WS訪問權限。(攔截器)
首先,編寫服務端驗證類繼承AuthenticationHandler
接着,在客戶端編寫類ClientAuthenticationHandler繼承AbstractHandler
然後,在調用WebService的客戶端中加入如下代碼
client.addOutHandler(new ClientAuthenticationHandler("abcd","1234"));
加入權限後代碼如下:
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.crimson.tree.XmlDocument;
import org.codehaus.xfire.client.Client;
import org.w3c.dom.*;
public class WebServices {
public static void main(String[] args) throws Exception {
/**
* 調用接口創建Client
*/
Client client = new Client(
new URL(
"http://127.0.0.1:7001/jdqb/services/JdqbInterface?wsdl"));
client.addOutHandler(new ClientAuthenticationHandler("abcd","1234"));
/**
* 調用接口方法(getList就是我們接口中定義的)
*/
Object[] results = client.invoke("getList",
new String[] { "0020100400000009" });
/**
* 得到了返回的數據文件,數據被封裝在了一個XmlDocument裏
* ,獲得XmlDocument後可以對XmlDocument進行解析得到目標文件,
* 具體的解析XmlDocument的方法很多就不囉嗦了
*/
XmlDocument doc = (XmlDocument) results[0];
同時修改services.xml,綁定Handler
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<xfire>
<inHandlers>
<handler handlerClass="services.jdqb.Test">
</handler>
</inHandlers>
</xfire>
<service>
<name>HelloWordwebservices</name>
<serviceClass>helloword.IHelloWordwebservices</serviceClass>
<implementationClass>
helloword.HelloWordwebservicesImpl
</implementationClass>
<inHandlers>
<handler handlerClass ="services.AuthenticationHandler" ></handler>
</inHandlers>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service></beans>
權限控制開發完畢,使用abcd@1234,可以正常訪問WS,如果用錯誤帳號,則會報異常
使用abcd@1234,可以正常訪問WS,如果用錯誤帳號,則會報異常
xfire與web項目整合
xfire集成到項目中,有幾個注意點:
第一、在web.xml添加xfire servlet;
第二、將META-INF/xfire/services.xml中要對外發布的web service類配置好;
第三、把META-INF目錄移到src下;
第四、發佈到應用服務器上;
所需jar包下載連接:
第五、將web工程原有的META-INF文件夾刪除,保留web-inf/classes裏的META-INF,整合完成。