天天看點

Windows下Apache WebDav的開啟及使用WebDAV相關配置WebDAV用戶端調用

WebDAV (Web-based Distributed Authoring and Versioning) 一種基于 HTTP 1.1協定的通信協定。它擴充了HTTP 1.1,在GET、POST、HEAD等幾個HTTP标準方法以外添加了一些新的方法,使應用程式可對Web Server直接讀寫,并支援寫檔案鎖定(Locking)及解鎖(Unlock),還可以支援檔案的版本控制。

本文将從配置檔案修改到有關java操作對Apache下WebDav的開啟與使用做一詳盡的介紹。

WebDAV相關配置

  • 修改httpd.conf

Include conf/extra/httpd-dav.conf
LoadModule dav_module modules/mod_dav.so 
LoadModule dav_fs_module modules/mod_dav_fs.so 
LoadModule dav_lock_module modules/mod_dav_lock.so
LoadModule auth_digest_module modules/mod_auth_digest.so
           

  •  為admin設定密碼

htdigest -c "D:/Program Files/Apache2.2/user.passwd" DAV-upload admin
           

運作如上指令後,會讓輸入密碼,重複輸入兩次,成功後,則會在Apache目錄下生成user.passwd檔案。

  • 修改httpd-dav.conf

DavLockDB "D:/Apache2.2/var/DavLock"

Alias /uploads "D:/Apache2.2/uploads"

<Directory "D:/Apache2.2/uploads">
    Dav On
    Options Indexes

    Order Allow,Deny
    Allow from all

    AuthType Digest
    AuthName DAV-upload

    # You can use the htdigest program to create the password database:
    #   htdigest -c "D:/Apache2.2/user.passwd" DAV-upload admin
    AuthUserFile "D:/Apache2.2/user.passwd"
    AuthDigestProvider file

    # Allow universal read-access, but writes are restricted
    # to the admin user.
    <LimitExcept GET OPTIONS>
        require user admin
    </LimitExcept>
</Directory>
           

其實,以上檔案内容為預設内容,不需要做修改,如果具有特殊需求則可根據具體需求做響應更改

  • 建立相關檔案

這一步非常重要,否者很有可能會出現問題!!!  1. 建立uploads目錄,這個在httpd-dav.conf檔案中已經指定  2. 建立以上httpd-dav.conf配置檔案第一行列出的var檔案夾,并在其中建立DavLock檔案,空檔案即可。

另外,需要注意的是,如果Apache主要作為負載均衡伺服器的話,那麼也不能關閉Apache的請求響應,否者的話,将無法正常使用WebDav功能。針對本處的WebDav的配置而言,需要對開啟Apache對于請求路徑為"/uploads"的響應。

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 項目。

本次測試将采用Apache Jackrabbit 2.8.1版本進行測試,具體的POM檔案配置如下:

<dependency>
      <groupId>org.apache.jackrabbit</groupId>
      <artifactId>jackrabbit-webdav</artifactId>
      <version>2.8.1</version>
    </dependency>
    <dependency>
      <groupId>commons-httpclient</groupId>
      <artifactId>commons-httpclient</artifactId>
      <version>3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.10</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.6.6</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.7.4</version>
</dependency>
           

Java用戶端調用示例

package com.hik.jack;

import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.StatusLine;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.MultiStatus;
import org.apache.jackrabbit.webdav.MultiStatusResponse;
import org.apache.jackrabbit.webdav.client.methods.CopyMethod;
import org.apache.jackrabbit.webdav.client.methods.DavMethod;
import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;
import org.apache.jackrabbit.webdav.client.methods.LockMethod;
import org.apache.jackrabbit.webdav.client.methods.MkColMethod;
import org.apache.jackrabbit.webdav.client.methods.MoveMethod;
import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;
import org.apache.jackrabbit.webdav.client.methods.PutMethod;
import org.apache.jackrabbit.webdav.client.methods.UnLockMethod;
import org.apache.jackrabbit.webdav.lock.Scope;
import org.apache.jackrabbit.webdav.lock.Type;

import java.io.FileInputStream;
import java.io.IOException;

public class Jack {

    public static void main(String[] args) {
        try {
            //建立HttpClient
            HttpClient httpClient = new HttpClient();
            //設定使用者名密碼認證形式
            Credentials creds = new UsernamePasswordCredentials("admin","*****");
            httpClient.getState().setCredentials(AuthScope.ANY, creds);
            // MKCOL method - 建立目錄
            DavMethod mkCol = new MkColMethod("http://10.10.162.101:8080/uploads/test");
            httpClient.executeMethod(mkCol);
            /**
             * 擷取執行傳回結果
             */
            int statusCode = mkCol.getStatusCode();
            String statusText = mkCol.getStatusText();
            StatusLine statusLine = mkCol.getStatusLine();
            System.out.println("mkcol test folder:" + statusCode + " " + statusText);
            System.out.println(statusLine.toString());

            // Put Method - 上傳本地檔案
            PutMethod put = new PutMethod("http://10.10.162.101:8080/uploads/test/cms.log");
            RequestEntity requestEntity = new InputStreamRequestEntity(new FileInputStream("D:\\logs\\cms.log"));
            put.setRequestEntity(requestEntity);
            httpClient.executeMethod(put);
            System.out.println("put image file:" + put.getStatusCode() + " " + put.getStatusText());

            // CopyMethod(String uri, String destinationUri, boolean overwrite) - 遠端拷貝本文
            DavMethod copy = new CopyMethod("http://10.10.162.101:8080/uploads/test/cms.log",
                    "http://127.0.0.1/uploads/test/cms2.log", true);
            httpClient.executeMethod(copy);
            System.out.println("copy image file:" + copy.getStatusCode() + " " + copy.getStatusText());

            //MoveMethod(String uri, String destinationUri, boolean overwrite) - 遠端重命名檔案
            DavMethod move = new MoveMethod("http://10.10.162.101:8080/uploads/test/cms2.log",
                    "http://127.0.0.1/uploads/test/cms3.log", true);
            httpClient.executeMethod(move);
            System.out.println("move image file:" + move.getStatusCode() + " " + move.getStatusText());

            //LockMethod(String uri, Scope lockScope, Type lockType, String owner, long timeout, boolean isDeep) - 檔案加鎖操作
            LockMethod lock = new LockMethod("http://10.10.162.101:8080/uploads/test/cms.log", Scope.SHARED, Type.WRITE, "admin",
                    10000l, false);
            httpClient.executeMethod(lock);
            String lockToken = lock.getLockToken();
            System.out.println("lock log file:" + lock.getStatusCode() + " " + lock.getStatusText());

            //UnLockMethod(String uri, String lockToken) - 檔案解鎖操作
            DavMethod unlock = new UnLockMethod("http://10.10.162.101:8080/uploads/test/cms.log", lockToken);
            httpClient.executeMethod(unlock);
            System.out.println("unlock log file:" + unlock.getStatusCode() + " " + unlock.getStatusText());

            // Find Method - 查找檔案操作
            DavMethod find = new PropFindMethod("http://10.10.162.101:8080/uploads/test/", DavConstants.PROPFIND_ALL_PROP,
                    DavConstants.DEPTH_1);
            httpClient.executeMethod(find);
            MultiStatus multiStatus = find.getResponseBodyAsMultiStatus();
            MultiStatusResponse [] responses = multiStatus.getResponses();
            System.out.println("Folders and files:");
            for (int i = 0; i < responses.length; i++) {
                System.out.println(responses[i].getHref());
            }

            // Delete Method - 删除遠端檔案
            DavMethod delete = new DeleteMethod("http://10.10.162.101:8080/uploads/test/");
            httpClient.executeMethod(delete);
            System.out.println("delete test folder:" + delete.getStatusCode() + " " + delete.getStatusText());

        } catch (IOException e) {
            e.printStackTrace();
        } catch (DavException e) {
            e.printStackTrace();
        }

    }

}
           

運作結果如下:

mkcol test folder:201 Created
HTTP/1.1 201 Created
put image file:201 Created
copy image file:201 Created
move image file:201 Created
lock log file:200 OK
unlock log file:204 No Content
Folders and files:
/uploads/test/
/uploads/test/cms.log
/uploads/test/cms3.log
delete test folder:204 No Content
           

以上示例示範了通過JackRabbit調用WebDav的一些功能,具體做了有關檔案的上傳、建立、移動、删除、加鎖、解鎖等操作。最終在uploads目錄并沒有任何檔案,這是由于最終通過DeleteMethod進行了删除,可以逐一運作某個方法來看具體效果。