WebDAV 概述
WebDAV(Web Distributed Authoring and Versioning)是一種基於 HTTP 的通訊協 議,是對 HTTP 的一種擴充,它在 HTTP 協議的 GET、HEAD、POST 等方法的基礎上添加了一些新的方法,使 得使用者可以通過用戶端編輯和管理儲存在遠端檔案。這些方法包括 PROPFIND、PROPPATCH、MKCOL、COPY、 MOVE、LOCK、UNLOCK 等方法。
顧名思義,WebDAV 關注的是創作(Authoring)和版本控制 (Versioning)的功能,所以它在自己的協議(RFC 2518)裡增加了文件屬性、資源集合、鎖、命名空間等概 念和機制。
雖然 WebDAV 的最初是為了方便遠程創作和版本管理,但有了以上機制和方法,WebDAV 經 常用來和 FTP、SFTP 等網路傳輸協議進行對比,WebDAV 可以看作是對檔案傳輸通訊協定的一種補充和選擇。由於 使用的是 HTTP 的連接埠,WebDAV 可以方便地穿越防火牆。而且由於可以使用 HTTPS,WebDAV 在安全性上並不 遜色於 SFTP。
WebDAV 在實際中已有廣泛的應用。伺服器方面,如 Apache HTTP Server 和 Microsoft IIS 上都可以找到 WebDAV 的身影。用戶端方面,IBM Lotus、Microsoft Office 等辦公自動化軟 件都可以通過 WebDAV 編輯遠端文檔。
JCR 及 Apache Jackrabbit 簡介
JCR 是 Content Repository for Java Technology API 的縮寫,譯為 Java 內容儲存規範,其規範定義在 JSR170 和 JSR283 ,兩者分別定義了 JCR 的 1.0 和 2.0 版本。其目的是簡化 Java 的資料管理,並希望建立起一種基於內容 倉庫(Repository)而不是傳統資料庫(例如 RDBMS)的編碼模型。內容倉庫的一個典型應是內容管理系統( CMS)。JCR 是內容倉庫的抽象,因為實際的內容倉庫可以基於資料庫,可能基於檔案系統或者其他適合的存 儲機制,例如 WebDAV 倉庫。而內容倉庫的訪問也有多種方式,包括直接存取(如應用程式的本地倉庫),或 者作為資源來訪問(如通過 JNDI 來訪問 Java EE 的容器),也可以使用 HTTP 或者 RMI 方式通過網路訪問 。
Apache Jackrabbit 是由 Apache Foundation 提供的 JCR 的開源實現。其起源可以追溯到 2002 年的 Apache Jakarta Slide 項目,該專案計劃實現 JSR170 定義的內容倉庫。隨後在 2004 年,關於 JCR 的開源實現成為一個單獨的項目,並命名為“Jackrabbit”。關於 Jakarta 和 Slide 項目,最初的 Jakarta 是一個包含 Ant、Maven、JMeter 等著名子項目的集合,Slide 也是其中的一個子項目。Slide 項目的主要內 容是內容倉庫,其中一個重要功能就是對 WebDAV 的支援,WebDAV 也可以看作是內容倉庫的重要基石。但 Slide 項目在 2004 年以後便沒有更新,並於 2007 年正式關閉。目前對 WebDAV 的支援主要來自 Jackrabbit 項目,實現 JCR1.0 的最新版本為 Jackrabbit1.6,實現 JCR2.0 的最新版本為 Jackrabbit2.4 。
使用 Jackrabbit 實現 WebDAV 用戶端
在進行編碼前,只需要在自己的工程中包含 Jackrabbit 的 JAR 檔案(例如 jackrabbit-standalone-2.4.3.jar),並使得可以在代碼中成功匯入 jackrabbit 庫檔案的資源。本文以在 Eclipse 開發環境中開發 WebDAV 用戶端為例,介紹使用 Jackrabbit 實現 WebDAV 的用戶端。如圖所示,首先需要在建立的 WebDAV 用戶端工程中匯入 Jackrabbit JAR 檔案。
圖 1. 匯入 Jackrabbit JAR 檔案
一般情況下,可以按照圖 2 所示的 流程來實現 WebDAV 用戶端,首先需要建立 HTTP 網路連接,即建立一個 HttpClient 對象,然後調用所需的 WebDAV 方法,並擷取方法調用的狀態代碼和傳回值,並根據狀態代碼和傳回值決定是否調用或調用何種其他 WebDAV 方法。
圖 2. 實現 WebDAV 用戶端