apache jackrabbit 实现 webdav 客户端怎么设置主体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache jackrabbit 实现 webdav 客户端怎么设置主体相关的知识,希望对你有一定的参考价值。

参考技术A 使用 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 客户端
第一步:建立网络连接。
在 java 中建立网络连接要简单许多,只需要创建 HttpClient 以及 Credentials 对象。并用新建的 Credentials 实例设置 HttpClient 实例的状态。其中 Credentials 对象保存了认证的用户名和密码。本例中的“admin”和“password”分别是 Apache HTTP 服务器中设定的用户名和密码。
清单 1. 建立 HttpClient 对象
HttpClient client = new HttpClient();
Credentials creds = new UsernamePasswordCredentials("admin", "password");
client.getState().setCredentials(AuthScope.ANY, creds);

第二步:调用 DavMethod 方法。
首先需要建立一个 DavMethod 对象,然后用第一步建立的 HttpClient 实例调用该方法。清单 2 中 MkColMethod 方法的作用是新建一个集合(Collection),其中 WebDAV 中的集合概念可以理解为目录,本例的作用是在 Web 服务器中的相对路径下建立 uploads/test/ 的目录,MkColMethod 的输入参数为新建目录的 URI。
清单 2. 调用 DavMethod 对象
// MKCOL method
DavMethod mkCol = new MkColMethod("http://127.0.0.1/uploads/test");
client.executeMethod(mkCol);

第三步:获取方法的返回状态。
调用完 WebDAV 的方法后,可以从该方法的对象中获得方法执行的状态信息。例如清单 3 的返回结果可能是“201”,“Created”和“HTTP/1.1 201 Created”。可以看出这些返回信息的格式和 HTTP 协议的返回值是一致的。
清单 3. 获取状态码
int statusCode = mkCol.getStatusCode();
String statusText = mkCol.getStatusText();
StatusLine statusLine = mkCol.getStatusLine();

第四步:分析返回值。
通过返回值,我们不仅可以知道方法调用是否成功,还能获取有用的数据进行下一步分析,例如对于一个完整的客户端实现,往往需要首先调用 PROPFIND 方法得到当前目录下的所有文件,然后再决定如何进行下一步操作。
清单 4. 获取返回值
// PROPFIND Method
DavMethod find = new PropFindMethod("http://127.0.0.1/uploads/test/",
DavConstants.PROPFIND_ALL_PROP, DavConstants.DEPTH_1);
client.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());


通过对以上调用方法的使用介绍,我们已经可以调用 WebDAV 的各种方法,读者应该已经可以根据自己的需求开发 WebDAV 客户端了。本文完整的程序代码见附件。
回页首
WebDAV 环境的的搭建与测试
在开发客户端的时候,往往需要和服务器一起进行调试,本节简要介绍如何搭建 WebDAV 服务器,并对开发的客户端进行了测试和验证。
WebDAV 服务器的搭建
由于 WebDAV 是对 HTTP 协议的扩展,所以一般 HTTP 服务器均支持 WebDAV。本文选择 Apache HTTP Server(也称为“httpd”)作为 WebDAV 服务器。以 Windows 环境为例,用户在安装了 Apache HTTP Server 之后,WebDAV 服务并不是默认运行的,还需要进行如下设置,才能打开 WebDAV 功能。
配置 httpd.conf 文件
打开 DAV 功能的注释
# Distributed authoring and versioning (WebDAV)
Include conf/extra/httpd-dav.conf

打开加载以下关于 DAV 的模块的注释
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

打开加载以下关于 auth_digest 的注释
LoadModule auth_digest_module modules/mod_auth_digest.so

为 admin 用户生成 user.passwd 文件
图 3. 运行 htdigest 生成 user.passwd 文件
新建所需目录
例如 D:\Program Files\Apache Software Foundation\Apache2.2\uploads 等。
重启 httpd 服务
图 4. 重启 httpd 服务
在搭建 WebDAV 服务器的时候,可以选择其他第三方的 WebDAV 客户端进行验证,例如 BitKinex 等免费工具。另外,在配置 WebDAV 服务器的时候,要注意文件目录的权限问题,例如 user.passwd 文件是否能正确生成。
WebDAV 客户端的测试
在 Eclipse 环境中运行示例代码的输出结果如下所示:
清单 5. 客户端记录
mkcol test folder:201 Created
put image file:201 Created
copy image file:201 Created
move image file:201 Created
lock image file:200 OK
unlock image file:204 No Content
Folders and files:
/uploads/test/
/uploads/test/lena2.jpg
/uploads/test/lena3.jpg
delete test folder:204 No Content

同时在 WebDAV 服务器中的 log 文件中记录了如下信息:
清单 6. 服务器日志
127.0.0.1 - - [25/Sep/2012:16:58:25 +0800] "MKCOL /uploads/test HTTP/1.1" 401 401
127.0.0.1 - admin [25/Sep/2012:16:58:25 +0800] "MKCOL /uploads/test HTTP/1.1" 201 187
127.0.0.1 - - [25/Sep/2012:16:58:25 +0800] "PUT /uploads/test/img.jpg HTTP/1.1" 401 401
127.0.0.1 - admin [25/Sep/2012:16:58:25 +0800] "PUT /uploads/test/img.jpg HTTP/1.1"
201 193
127.0.0.1 - - [25/Sep/2012:16:58:25 +0800] "COPY /uploads/test/img.jpg HTTP/1.1" 401 401
127.0.0.1 - admin [25/Sep/2012:16:58:25 +0800] "COPY /uploads/test/img.jpg HTTP/1.1"
201 198
127.0.0.1 - - [25/Sep/2012:16:58:25 +0800] "MOVE /uploads/test/img.jpg HTTP/1.1" 401 401
127.0.0.1 - admin [25/Sep/2012:16:58:25 +0800] "MOVE /uploads/test/img.jpg HTTP/1.1"
201 198
127.0.0.1 - - [25/Sep/2012:16:58:25 +0800] "LOCK /uploads/test/img.jpg HTTP/1.1" 401 401
127.0.0.1 - admin [25/Sep/2012:16:58:25 +0800] "LOCK /uploads/test/img.jpg HTTP/1.1"
200 414
127.0.0.1 - - [25/Sep/2012:16:58:25 +0800] "UNLOCK /uploads/test/img.jpg HTTP/1.1" 401
401
127.0.0.1 - admin [25/Sep/2012:16:58:25 +0800] "UNLOCK /uploads/test/img.jpg HTTP/1.1"
204 -
127.0.0.1 - - [25/Sep/2012:16:58:25 +0800] "PROPFIND /uploads/test/ HTTP/1.1" 401 401
127.0.0.1 - admin [25/Sep/2012:16:58:25 +0800] "PROPFIND /uploads/test/ HTTP/1.1" 207
2434
127.0.0.1 - - [25/Sep/2012:16:58:25 +0800] "DELETE /uploads/test/ HTTP/1.1" 401 401
127.0.0.1 - admin [25/Sep/2012:16:58:25 +0800] "DELETE /uploads/test/ HTTP/1.1" 204 -

说明示例客户端程序和服务器进行了交互,执行并验证了 WebDAV 协议中的方法的使用。

Sling vs CMIS 作为 Apache jackrabbit 的 REST 接口

【中文标题】Sling vs CMIS 作为 Apache jackrabbit 的 REST 接口【英文标题】:Sling vs CMIS as a REST interface for Apache jackrabbit 【发布时间】:2013-03-17 15:02:35 【问题描述】:

如果我得到它,Apache Sling 会为 Jackrabbit JCR 存储库充当 REST CRUD 接口。

由于已经存在 RESTful 协议(CMIS 在其 AtomPub 实现中) 使用 JCR 存储库,除了视图/模板层,是否存在 使用 Apache Sling 与 CMIS 有什么优势(即通过 Apache Chemistry)?

有什么可以使用CMIS不支持的JCR(Sling)来完成的吗?

【问题讨论】:

【参考方案1】:

这两种协议的一些特点可能会帮助您选择一个来使用。

CMIS

最初是作为跨不同(文档)内容存储库联合内容的一种方式,其核心业务是让不同的内容存储库通过 Web 界面 (REST / WS) 相互通信。虽然最新版本的协议通过基于 JSON 的浏览器绑定改进了对内容的浏览器操作,但 CMIS 经常表现为一个有点闲聊的协议,并不总是在内容交付方面大放异彩。

PROS:标准,由众多供应商支持,支持稍微丰富的数据模型(Renditions、Policies)

缺点:很健谈,如果使用 AtomPub 或 WS 绑定,需要进行大量 XML 解析,无法创建自定义服务 API

吊索

我不是这方面的专家,但据我所知,它是 JCR 之上的一个轻量级、可扩展的 HTTP 层。数据处理逻辑与您通过 HTTP 作为组件请求的内容相关联,使您能够在交付前处理并最终优化内容。

优点:在内容检索之上添加了一个数据处理层,在纯 HTTP 上工作,无需复杂的有效负载来描述每个操作

缺点:非标准,无法轻松交换内容存储库

【讨论】:

我同意 skuro 的观点,基本上,如果您知道您将在 Sling HTTP API 下拥有一个 JCR 存储库,将为您提供更强大、更直接的接口,并且选择很容易。 CMIS 有利于互操作性,但它不像 Sling 接口那样映射到 JCR。 能否请您详细说明映射的差异?也许在一个答案中,所以我可以投票=) 同时我发现了这个svn.apache.org/repos/asf/chemistry/opencmis/trunk/…

以上是关于apache jackrabbit 实现 webdav 客户端怎么设置主体的主要内容,如果未能解决你的问题,请参考以下文章

Apache Jackrabbit 和 Jackrabbit Oak 有啥区别?

Sling vs CMIS 作为 Apache jackrabbit 的 REST 接口

如何在不关闭 Jackrabbit 的情况下备份 apache Jackrabbit 存储库?

Apache Jackrabbit Oak 1.5.9 发布

如何学习使用内容存储库和 Apache JackRabbit?

Apache Jackrabbit - 重复节点?