異常是一個事件,它出現在程序執行過程當中,會中斷程序指令的正常流程。如果一種方法或者一項Web服務操作出現錯誤,就會出現異常。引起錯誤的可能是程序缺陷或者缺少系統資源。典型的問題包括如下:用戶輸入錯誤:用戶無意中輸入了不正確的字符; 物理限制:磁盤空間已滿或者溢出可用內存;設備錯誤:硬件不能正常工作,如無法啟用的USB移動硬盤;網絡錯誤:應用服務器試圖使用Java數據庫連接性(JDC)連接到遠程數據庫。
要是被調用方法即提供者出現錯誤,就必須通知調用程序即使用者。這時,通過編程實現的復雜的異常處理就可以發揮作用:異常出現在調用程序面前,以便從異常中恢復過來。高明的編程人員通常會預料到異常,然后通過編寫程序來處理它們;不過,不是所有異常都是能預料到的,也不是所有異常都是能夠恢復的。要是沒發現異常處理程序,運行系統就會終止、出現不可靠的動作。
Java和.Net等編程接口擁有一系列廣泛、復雜的異常處理功能。開發人員可以使用if-then-else條件結構和try-catch-finally代碼塊來構建一組豐富的錯誤處理模式。使用這樣一些異常處理模式,開發人員就可以降低程序嚴重崩潰或者程序突然終止的風險,并且為應用程序添加可靠性。
在基于Web服務的分布式架構里面,異常處理必須滿足額外需求。如今,異常必須能獨立于操作系統、編程語言和應用程序進行傳送。異常必須提供給使用者,那樣它們就隨時可以解釋; 如果某異常能夠恢復,使用者就可以無縫應答Web服務提供者拋出的異常,提供者可能在企業IT部門的里面,也可能在外面。在傳送這種異常時,還要關注企業安全。如果異常處理不嚴格、不認真、不慎重,提供者的Web服務就有可能把內部IT資產的詳細信息透露給使用者,或者在堆棧跟蹤中泄漏敏感的企業信息。
為了探討Web服務的異常處理,本文構建了一個簡單的Java類,使用眾多的類似方法對兩個數進行除法運算。這些方法處理異常的能力各不相同,有的方法完全缺少異常處理機制,而有的方法對許多異常場景擁有顯式異常處理結構。如圖1所示,我們使用以下組件來準備異常處理測試:
1.BEA WebLogic Portal 9.2是面向基于Java應用開發的一款應用服務器。安裝程序包括BEA Workshop for WebLogic Platform,這是用于迅速構建Web服務的一種IDE。我們決定使用WebLogic,因為它在業界的應用很廣泛,而且易于構建Web服務。
2.Crosscheck Networks SOAPSonar是一個Web服務測試客戶程序,它使用WSDL,并且可以為目標Web服務生成功能、性能、互操作性和漏洞等測試。
未保護的Web服務
第一個Web服務根本沒有防范不利條件的機制。如以下代碼所示,這個基本方法讀入幾個雙精度輸入,然后除數除被除數,返回作為結果的雙精度值。
package mathservice; |
一般而言,堆棧跟蹤信息對Web服務使用者毫無用處,使用者也沒有多少辦法可以從這樣的通用、冗長的異常中恢復過來。這不像一組簡單的文檔返回代碼發送到客戶程序、從除以零或者空值異常中輕松恢復過來。發送到客戶程序的堆棧跟蹤信息不但毫無用處、代碼上不可執行,它還可能會把實現細節傳送給外部使用者,有可能被人進一步利用。
防御性Web服務
下面的代碼片顯示,防御性Web服務defensiveDivide(…)建立在前一個方法nakedDivide(…)上的基礎上,添加了簡單的檢查機制查看除數是不是零。這可以確保除以零錯誤不會出現。如果除數是零,該方法就會返回0,那樣調用程序就可以從不合適的零除數輸入中恢復過來。在這種方法中,編程人員預料到了邊界條件,編寫防御性代碼來處理它。
@WebMethod |
共2頁: 1 [2] 下一頁 |