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进行了删除,可以逐一运行某个方法来看具体效果。