Sun ONE Web Server 6.1 管理员指南 |
第 19 章
使用 WebDAV 实现 Web 发布Sun ONE Web Server 6.1 支持 WebDAV(即基于 Web 的分布式制作和版本发布),这是一种新兴的基于 Web 的协作标准。WebDAV 是 HTTP/1.1 协议的扩展,它允许客户机执行远程 Web 内容制作操作。
本章主要介绍如何在 Sun ONE Web Server 6.1 中使用 WebDAV。其中包括以下部分:
关于 WebDAVWebDAV 是对 HTTP/1.1 协议的扩展,添加了新的 HTTP 方法和标头,支持任意类型的 Web 制作,不仅支持 HTML 和 XML,还支持文本、图形、电子表格等格式。
使用 WebDAV 可以完成的工作包括:
- 特性(元数据)处理。您可以使用 WebDAV 方法 PROPFIND 和 PROPPATCH 创建、删除和查询有关 Web 页面的信息,例如作者和创建日期。
- 集合和资源管理。您可以使用 WebDAV 方法 GET、PUT、DELETE 和 MKCOL 创建文档集合并检索分层结构成员列表(类似于文件系统中的目录列表)。
- 锁定。您可以使用 WebDAV 禁止多人同时对一个文档进行操作。可以通过 WebDAV 方法 LOCK 和 UNLOCK 使用互斥锁或共享锁,这将有助于防止出现“丢失更新”(更改被覆盖)的问题。
- 名称空间操作。您可以使用 WebDAV 方法 COPY 和 MOVE 让服务器复制和删除 Web 资源。
Sun ONE Web Server 6.1 中的 WebDAV 支持提供了以下功能:
常见 WebDAV 术语本节概述了使用 WebDAV 时经常遇到的术语。
URI。URI(统一资源标识符)是一种文件标识符,通过使用缩写的 URL 提供了额外的安全保护。一个 URL 映射代替了 URL 的第一部分,从而对用户隐藏了文件的完整物理路径名。
源 URI。术语“源 URI”是指能用来访问资源的源代码的 URI。为了更好地理解源 URI 的概念,请参见以下实例:
一个名为 foo.jsp 的 JSP 页面位于 URI /docs/date.jsp 处。该页面包含 HTML 标记和 Java 代码,当执行该代码时,将在客户机的浏览器中打印当前的日期。当服务器收到客户机获取 foo.jsp 的 GET 请求后,先执行该 Java 代码,然后提供该页面。客户机收到的并不是该 foo.jsp 页面(因为它驻留在服务器上),而是一个显示当前日期的动态生成的页面。
如果您要创建一个源 URI(例如 /publish/docs)并将其映射到包含 foo.jsp 的 /docs 目录,则对 /publish/docs/foo.jsp 的请求将是请求 /docs/foo.jsp JSP 页面的源代码。在这种情况下,服务器将提供页面而不执行 Java 代码。客户机将收到未经处理的页面,与保存在磁盘中的一样。
这样,对源 URI 的请求也就成了请求资源的源代码。
集合。 WebDAV 集合是为 WebDAV 操作启用的一个或一组资源。集合包含一组称为成员 URI 的 URI,它们标识了启用了 WebDAV 的成员资源。
成员 URI。集合中一组 URI 中的一个成员。
内部成员 URI。与集合的 URI 直接相关的一个成员 URI。例如,如果 URL 为 http://info.sun.com/resources/info 的资源启用了 WebDAV,并且如果 URL 为 http://info.sun.com/resources/ 的资源也启用了 WebDAV,则 URL 为 http://info.sun.com/resources/ 的资源就是一个集合,它包含 http://info.sun.com/resources/info 并将其作为一个内部成员。
特性。一个包含资源的相关说明性信息的“名称/值”对。使用特性可以有效地查找和管理资源。例如,可以使用特性“creationdate”按资源的创建日期索引所有资源,或者使用特性“author”按作者姓名进行索引。
动态特性。由服务器强制实现的特性。例如,动态特性 getcontentlength 有一个值,即 GET 请求返回的实体的长度,它是由服务器自动计算的。动态特性具有以下特性:
静态特性。不是由服务器强制实现的特性。服务器仅记录静态特性的值;客户机负责维护其一致性。
Sun ONE Web Server 6.1 支持以下动态特性:
- creationdate
- displayname
- getcontentlanguage
- getcontentlength
- getcontenttype
- gettag
- getlastmodified
- lockdiscovery
- resourcetype
- supportedlock
- executable
锁定。锁定资源功能提供了这样一种机制,即可以保证在一个用户编辑资源时,其他用户不能进行修改。锁定可以防止发生覆盖冲突,解决了“丢失更新”的问题。
Sun ONE Web Server 支持两种锁定类型:共享和互斥。
新 HTTP 标头。WebDAV 扩展了 HTTP/1.1 协议。它定义了新的 HTTP 标头,客户机可以通过这些新标头传递 WebDAV 资源请求。这些标头为:
新 HTTP 方法。WebDAV 引入了若干新 HTTP 方法,用于告知启用了 WebDAV 的服务器如何处理请求。这些方法是对现有方法(例如 GET、PUT 和 DELETE)的补充,可用来执行 WebDAV 事务。下面简要介绍这些新 HTTP 方法:
- COPY。用于复制资源。可以使用 Depth: 标头移动资源,使用 Destination: 标头指定目标。如果适用,COPY 方法也使用 Overwrite: 标头。
- MOVE。用于移动资源。可以使用 Depth: 标头移动资源,使用 Destination: 标头指定目标。如果适用,MOVE 方法也使用 Overwrite: 标头。
- MKCOL。用于创建新集合。使用此方法可避免过载 PUT 方法。
- PROPPATCH。用于设置、更改或删除单个资源的特性。
- PROPFIND。用于获取一个或多个资源的一个或多个特性。当客户机向服务器提交对某个集合的 PROPFIND 请求时,该请求可能会包含一个值为 0、1 或 infinity 的 Depth: 标头。
- LOCK。为资源添加锁。使用 Lock-Token: 标头。
- UNLOCK。删除资源的锁。使用 Lock-Token: 标头。
使用 WebDAV一个完整的 WebDAV 事务包括一个启用了 WebDAV 的服务器(例如 Sun ONE Web Server 6.1),它可以为 WebDAV 资源请求提供服务,还包括一个启用了 WebDAV 的客户机(例如 Adobe® GoLive® 或 Macromedia® DreamWeaver®),它支持启用了 WebDAV 的 Web 发布请求。
在服务器端,需要启用并配置 Sun ONE Web Server 6.1 以便能够为 WebDAV 请求提供服务。
要配置 Sun ONE Web Server 6.1 以便使用 WebDAV,需要执行以下步骤:
启用 WebDAV安装 Sun ONE Web Server 6.1 时,缺省情况下 WebDAV 被禁用。
为了在集合级别启用 WebDAV,还需要在服务器实例级别和虚拟服务器类级别启用 WebDAV。
以下各部分对在不同级别上启用 WebDAV 进行了说明:
为服务器实例启用 WebDAV
您可以使用 Administration Server 为整个服务器启用 WebDAV。执行此操作时,以下指令将添加到用于加载 WebDAV 插件的 magnus.conf 文件中:
Init fn="load-modules" shlib="/s1ws6.1/lib/libdavplugin.so" funcs="init-dav,ntrans-dav,pcheck-dav,service-dav"
shlib_flags="(global|now)"
Init fn="init-dav" LateInit=yes
init-dav Init 函数将初始化并注册 WebDAV 子系统。
要全局启用 WebDAV,请执行以下步骤:
为虚拟服务器类启用 WebDAV
要为特定虚拟服务器类启用 WebDAV,请执行以下步骤:
为虚拟服务器类启用 WebDAV 时,将使用以下条目更新相关联的 obj.conf 文件:
为集合启用 WebDAV
如果向某个虚拟服务器添加了一个或多个 WebDAV 集合,您可以随时启用或禁用它们。有关如何执行此操作的信息,请参见编辑 WebDAV 集合。
创建 WebDAV 集合WebDAV 集合是为 WebDAV 操作启用的一个或一组资源。这些操作包括 Web 发布和协作制作、名称空间管理以及元数据管理。
要向虚拟服务器添加 WebDAV 集合,请执行以下步骤:
- 确保为服务器实例和虚拟服务器类启用了 WebDAV。有关详细信息,请参见为服务器实例启用 WebDAV和为虚拟服务器类启用 WebDAV。
- 访问您要管理的虚拟服务器并单击“WebDAV”选项卡。
- 在“Add DAV Collection”中,输入以下信息:
- URI(必需)。用于访问内容的 URI。
- Source URI(可选)。用于访问源的 URI。
有关术语“源 URI”的解释,请参见“常见 WebDAV 术语”。
- Lock Database(可选)。用于维护锁数据库的目录。缺省值为 server-instance/lock-db/vs-id。
- Minimum Lock Timeout(可选)。锁的最小生命周期(秒)。缺省值为 0。有关详细信息,请参见“最小锁超时”。
- Limit XML Request Body(可选)。请求正文中 XML 内容的最大大小。对大小进行限制可防止可能出现的拒绝服务(Denial of Service,DOS)攻击。
- Maximum Property Depth(可选)。PROPFIND 请求的深度。
- Enabled(可选)。为集合启用 WebDAV 功能。
- 单击“OK”。
编辑 WebDAV 集合您可以编辑现有 DAV 集合的属性,例如,配置集合的访问控制。
要编辑现有的 WebDAV 集合,请执行以下步骤:
- 访问集合所在的虚拟服务器,然后单击“WebDAV”选项卡。
- 在“Edit DAV Collections”中,修改以下信息:
- Delete。允许您删除集合。
- URI。显示用于访问内容的 URI。
- Enabled。表示是启用 (true) 还是禁用 (false) WebDAV。
- Edit Collection。单击此按钮可进行以下配置:
- URI(必需)。用于访问内容的 URI。
- Source URI(可选)。用于访问源的 URI。
- Lock Database(可选)。用于维护锁定数据库的目录。
- Minimum Lock Timeout(可选)。锁的最小生命周期(秒)。有关详细信息,请参见“最小锁超时”。
- Limit XML Request Body(可选)。请求正文中 XML 内容的最大大小。
- Maximum Property Depth(可选)。PROPFIND 请求的深度。
- 0 只适用于指定的资源。
- 1 适用于指定的资源及其包含的下一级资源。
- infinity 适用于指定的资源及其包含的所有资源。
- Edit ACL。单击此按钮可为该集合或 URI 设置访问控制限制。
配置 WebDAV由于以下原因,您可能希望对 WebDAV 进行配置:例如,要优化服务器性能、消除安全风险或提供无冲突的远程制作。
为满足您的配置要求,您可以更改服务器对 WebDAV 资源的最小锁时间、对集合的 PROPFIND 请求的深度以及请求正文所允许的 XML 内容的最大大小等设置。
可以在虚拟服务器级别为虚拟服务器下的所有集合配置缺省 WebDAV 属性。此处配置的值与 server.xml 文件中的 DAV 元素相对应。
也可以在集合级别配置 WebDAV 属性,这将覆盖为集合配置的任何虚拟服务器级别属性。在集合级别配置的属性与 server.xml 文件中的 DAVCOLLECTION 元素相对应。
在虚拟服务器级别配置 WebDAV
要为虚拟服务器配置 WebDAV 功能,需要编辑 DAV 对象的属性。您可以通过使用 Administration Server 或手动编辑 server.xml 文件来执行此操作。
下表说明了可配置的 DAV 对象的属性:
表 19-1 DAV 对象的属性
属性
说明
enabled
指定是否为该虚拟服务器启用了 WebDAV 功能。
这是一个可选属性。缺省值为 true。
可能的值为 true 和 false。
lockdb
指定用于维护锁定数据库的目录。
这是一个可选属性。
minlocktimeout
指定锁的最小生命周期(秒)。此值表示锁被自动删除之前某元素被锁定的时间。有关详细信息,请参见最小锁超时。
这是一个可选属性。
maxxmlrequestbodysize
指定请求正文中 XML 内容的最大大小。
这是一个可选属性。缺省值为 8K。
对大小进行限制可防止可能出现的拒绝服务 (DOS) 攻击。
maxpropdepth
指定 PROPFIND 请求的深度。
这是一个可选参数。缺省值为 0。
通过限制此参数的大小可防止过度消耗内存。
在 URI 级别配置 WebDAV
要在 URI 级别配置 WebDAV 功能,需要编辑 server.xml 文件中 DAVCOLLECTION 对象的属性。
下表说明了可配置的 DAVCOLLECTION 对象的属性:
表 19-2 DAVCOLLECTION 对象的属性
属性
说明
enabled
指定是否为该集合启用了 DAV 功能。
这是一个可选属性。
可能的值为 true 和 false。缺省值为 true。
uri
指定用于访问内容的 URI。
这是一个必需属性。
sourceuri
指定用于访问源的 URI。有关详细信息,请参见常见 WebDAV 术语和在启用了 WebDAV 的服务器上使用源 URI 和 Translate:f 标头。
这是一个可选属性。
如果未指定 sourceuri,则缺省行为是拒绝对集合中任何动态内容的源代码的访问。
您可以为 uri 和 sourceuri 指定相同的 URI,这样,服务器将始终返回动态内容的源代码。如果您使用一个独立的、安全的虚拟服务器进行发布,这会很有用。
lockdb
指定用于维护锁定数据库的目录。
这是一个可选属性。
minlocktimeout
指定锁的最小生命周期(秒)。此值表示锁被自动删除之前某元素被锁定的时间。有关详细信息,请参见最小锁超时。
这是一个可选属性。
maxxmlrequestbodysize
指定请求正文中 XML 内容的最大大小。
这是一个可选属性。
对大小进行限制可防止可能出现的拒绝服务 (DOS) 攻击。
maxpropdepth
指定 PROPFIND 请求的深度,它列出了集合的成员资源。
这是一个可选参数。
通过限制此参数的大小可防止过度消耗内存。
在启用了 WebDAV 的服务器上使用源 URI 和 Translate:f 标头WebDAV 方法处理资源或集合的源。HTTP 方法(例如 GET 和 PUT)会被 WebDAV 协议过载。因此,使用这些方法的请求可以是对资源的源代码的请求,也可以是对资源的内容的请求。
Microsoft 和许多其他 WebDAV 供应商通过以下方式解决了此问题,即随请求发送一个 Translate:f 标头来告知服务器所请求的是源代码。为了能够与常用的 WebDAV 客户机 Microsoft WebFolders 实现互操作,Sun ONE Web Server 6.1 将 Translate:f 标头识别为对资源的源代码的请求。针对不发送 Translate:f 标头的客户机,Sun ONE Web Server 6.1 定义了一个源 URI。有关术语“源 URI”的更详细说明,请参见常见 WebDAV 术语。
对于启用了 WebDAV 的集合,对 URI 的请求将检索资源的内容(输出),而对源 URI 的请求将检索资源的源代码。带有 Translate:f 标头的 URI 请求被看作是对源 URI 的请求。
请注意,缺省情况下,所有对资源的源代码的访问均被 dav-src ACL 拒绝,即在服务器实例的特定 ACL 文件中包含以下声明:
deny (all) user = "anyone";
用户可以通过添加对源 URI 的访问权限来允许另一个用户对源代码进行访问。有关添加特定 URI 的 ACL 的详细信息,请参见为 WebDAV 启用访问控制。
锁定和解除锁定资源Sun ONE Web Server 允许服务器管理员锁定资源,以实现对该资源的有序访问。通过使用锁,正在访问某特定资源的用户可以确定其他用户不会修改同一资源。这样就解决了多用户共享服务器上的资源时的“丢失更新”问题。由服务器维护的锁数据库将跟踪客户机发出和正在使用的锁定记。
Sun ONE Web Server 6.1 支持 opaquelocktoken URI 方案,该方案被设计为在所有资源中始终是唯一的。它使用了通用唯一标识符 (UUID) 机制,如 ISO-11578 中所述。
Sun ONE Web Server 6.1 可识别两种锁定机制:
互斥锁
互斥锁仅将资源的访问权限授予一个用户。其他用户要想访问同一资源,只能等到互斥锁被解除。
人们有时觉得互斥锁定这种资源锁定机制太死板,代价也很大。例如,当程序崩溃或锁所有者忘记解除锁定资源时,便需要通过锁定超时或管理员参与来解除互斥锁。
共享锁
共享锁允许多个用户接收某个资源的锁。这样,具有适当访问权限的任何用户都可以获得该锁。
使用共享锁时,锁所有者之间可以使用其他通信通道来协调工作。共享锁的目的是让协作者知道谁还在使用同一资源。
锁管理
Sun ONE Web Server 6.1 提供了一个锁管理功能,使您可以查看所有现有锁、锁的类型、锁的资源以及锁的持续时间等。
要使用锁管理功能,请执行以下步骤:
最小锁超时
您可以通过在 server.xml 文件中配置 DAV 或 DAVCOLLECTION 对象的 minlocktimeout 属性值来控制锁定。minlocktimeout 属性指定锁的最小生命周期(秒)。此值表示锁被自动删除之前某元素被锁定的时间。
这是一个可选属性。如果此值被设置为 -1,锁将永远不会过期。如果将此值设置为 0,则可以使用请求中指定的 Timeout 标头锁定集合中的所有资源。
如果未指定 Timeout 标头,资源将被锁定且永远不会超时。如果将请求中的 Timeout 标头值设置为 Infinite,同样,资源将被锁定且永远不会超时。
如果对 WebDAV 资源的请求的 Timeout 标头值大于或等于 server.xml 文件中指定的 minlocktimeout 值,则资源的锁定时间将是请求中指定的时间。
但是,如果请求中的 Timeout 标头值小于 server.xml 文件中指定的 minlocktimeout 值,则使用 server.xml 文件中指定的 minlocktimeout 值来锁定资源。
下表列出了 Sun ONE Web Server 处理锁定请求的方式:
表 19-3 Sun ONE Web Server 处理锁定请求的方式
如果请求中的 Timeout 标头被设置为:
则资源:
Infinite
被锁定且超时值被设置为 -1(无限)
无
被锁定且超时值被设置为 -1(无限)
Second-xxx
或者
锁定请求实例
该实例显示了一个资源 /col1/myfile.html 上的互斥写锁定请求,超时值为 500 秒。
LOCK /col1/myfile.html HTTP/1.1
Host:sun
Content-Type:text/xml; charset="utf-8"
Content-Length: 259
Timeout:Second-500
<?xml version="1.0" encoding="utf-8" ?>
<d:lockinfo xmlns:d="DAV:">
<d:locktype><d:write/></d:locktype>
<d:lockscope><d:exclusive/></d:lockscope>
<d:owner>
<d:href>http://info.sun.com/resources/info.html</d:href>
</d:owner>
</d:lockinfo>
为 WebDAV 启用访问控制您可以控制哪些用户可访问启用了 WebDAV 的文档和目录,以及不同的用户或用户组可对文件执行何种操作。您也可以完全禁止对某个文件或文件夹的访问,或只允许特定的授权用户访问。
如果管理您的服务器的缺省访问控制 (ACL) 没有对您进行限制或限制不多,您便可以使用限制访问功能(选择“Server Preferences”,然后单击“Restrict Access”链接)创建一个更适合的 ACL 来限制对启用了 WebDAV 的资源的访问。
WebDAV 请求分别在 AuthTrans 和 PathCheck NSAPI 阶段进行验证和授权。下面的实例定义了一个访问控制规则,禁止除名为“joe”以外的所有用户对 /catalog 集合进行写入和删除操作:
acl "uri=/catalog/*";
deny(all)
user="anyone";
allow (read,list,execute,info)
user = "all";
allow(write,delete)
user="joe";
有关详细信息,请参见编辑 WebDAV 集合。
限制对启用了 WebDAV 的资源的访问
对 WebDAV 集合的访问控制是使用本地 ACL 文件指定的。每个 WebDAV 方法都会请求一个对启用了 WebDAV 的资源的特定访问权限。例如,如果某个启用了 WebDAV 的文件要被多个并行用户共享,为锁定或解除锁定资源以便进行并行控制,需要具备资源的写权限。
下表汇总了 WebDAV 方法所需的权限。
表 19-4 WebDAV 所需的权限
DAV 方法
所需访问权限
DELETE
删除
PROPFIND
读
PROPPATCH
写
LOCK/UNLOCK
写
MKCOL
写
COPY(src/dst)
src - 读
dst - 写
MOVE(src/dst)
src - 删除
dst - 写
GET on request-uri
读
GET on request-uri
Translate:f
读
PUT on request-uri
写
PUT on request-uri
Translate:f
写
安全性考虑使用 WebDAV 时,请注意以下安全性考虑:
- 确保启用了 WebDAV 的服务器进程对要控制的文件系统具有读/写权限。
- 出于安全性考虑,您可以在另一个侦听端口上配置启用了 WebDAV 的虚拟服务器,该端口限制了访问权限并使用了 SSL 来加密传送的数据。有关使用 SSL 的详细信息,请参见使用证书和密钥。
- 限制请求正文中 XML 内容的大小以防止拒绝服务 (DOS) 攻击。缺省情况下,该大小被限制为 8K。
- 由于基本验证使用明文来传送验证更多信息,所以除非您的连接是安全的,否则请使用摘要验证来验证 WebDAV 客户机,而不要使用基本验证。
- 由于 PROPFIND 请求有可能导致不希望的服务器内容访问,因而请使用访问控制技术保护启用了 WebDAV 的资源的安全。
- WebDAV 有可能通过其源 URI 工具暴露包含敏感信息(如脚本资源)的 URI。所以应当注意允许远程编写脚本的风险,并且应当只允许授权用户对源资源进行读/写访问。
- 限制 PROPFIND 请求的深度以防止过度消耗内存。缺省情况下,深度被限制为 0。