5月阅读周·HTTP权威指南:发布系统之WebDAV的锁定与防止覆写篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议)是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
发布系统
怎样创建Web页面并放到Web服务器上去呢?在Web发展的“蛮荒”时代(比如1995年),可能要在文本编辑器中手工拼凑HTML,用FTP手动把内容上传到Web服务器。这个过程很痛苦,很难与同事配合,也不是特别安全。如今的发布工具使得创建、发布以及管理Web内容方便了许多。今天,用户可以交互式地编辑Web内容,在屏幕上看到它实际呈现的样子,轻轻点击一下就可以把内容发布到服务器,还能得到所有文件变化的通知。
WebDAV的锁定与防止覆写
根据定义,协作要有不止一个人在给定的文档上工作。
比如,作者A和B联合编写一份规范。A和B各自独立地对文档做了一些修改。A把更新的文档上传到仓库。之后,B也把自己的版本提交到仓库。不幸的是,由于B压根不知道A的修改,他没有把自己的版本与A的版本进行合并,从而导致A的修改丢失。
为了改善这种问题,WebDAV支持锁定的概念。但单靠锁定不能完全解决这个问题,还需要版本管理和消息传送才能提供完整的解决方案。WebDAV支持两种类型的锁:
- 对资源或集合的独占写锁;
- 对资源或集合的共享写锁。
独占写锁保证只有锁的拥有者有写权限。这种锁完全消除了潜在的冲突。共享写锁允许多个人在某个给定的文件上工作。这种锁定机制在多名作者对各自的活动都知晓的环境下可以很好地工作。WebDAV通过PROPFIND方法提供了属性发现机制,可以判断对锁定的支持和所支持的锁定类型。
WebDAV中有两个新方法支持锁定机制:LOCK和UNLOCK。
为了实现锁定,还需要有一种识别作者的机制。WebDAV采用的是摘要认证。
LOCK方法
WebDAV中的一个强大特性是它能够允许单个LOCK请求锁定多个资源。WebDAV的锁定不需要客户端保持与服务器的连接。这是一个简单的LOCK请求示例:
LOCK /ch-publish.fm HTTP/1.1
Host: minstar
Content-Type: text/xml
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Content-Length: 201
<? xml version="1.0"? >
<a:lockinfo xmlns:a="DAV:">
<a:lockscope><a:exclusive/></a:lockscope>
<a:locktype><a:write/></a:locktype>
<a:owner><a:href>AuthorA</a:href></a:owner>
</a:lockinfo>
提交的XML以<lockinfo>元素作为其基元素。在<lockinfo>结构中,有以下3种子元素。
· <locktype>指明锁定的类型。当前只有一种可选值,即write。
· <lockscope>指明这是独占锁还是共享锁。
· <owner>这个字段设置为当前持有锁的人。
下面是这个LOCK请求的成功响应:
HTTP/1.1200 OK
Server: Microsoft-IIS/5.0
Date: Fri, 10 May 2002 20:56:18 GMT
Content-Type: text/xml
Content-Length: 419
<? xml version="1.0"? >
<a:prop xmlns:a="DAV:">
<a:lockdiscovery><a:activelock>
<a:locktype><a:write/></a:locktype>
<a:lockscope><a:exclusive/></a:lockscope>
<a:owner xmlns:a="DAV:"><a:href>AutherA</a:href></a:owner>
<a:locktoken><a:href>opaquelocktoken:*****</a:href></a:locktoken>
<a:depth>0</a:depth>
<a:timeout>Second-180</a:timeout>
</a:activelock></a:lockdiscovery>
</a:prop>
<lockdiscovery>元素充当着存储锁信息的容器。嵌入在<lockdiscovery>元素中的子元素有<activelock>,它持有请求发送来的信息(<locktype>、<lockscope>以及<owner>)。此外,<activelock>中还含有以下子元素。
· <locktoken>用称为opaquelocktoken的URI方案唯一标识的锁。考虑到HTTP天生就是无状态的,该令牌用于在将来的请求中标识锁的所有权。
· <depth>它是Depth首部的值的副本。
· <timeout>指明锁的超时时间。在上面的响应中,超时值是180秒。
1.opaquelocktoken方案
opaquelocktoken是设计用来在所有时间内对所有资源提供唯一令牌的方案。为了确保唯一性,WebDAV规范规定采用ISO-11578中描述的UUID机制。在实际实现的时候,有一定的回旋余地。服务器可以选择为每个LOCK请求生成一个UUID,或者生成单个UUID并通过在结尾附加额外的字符来维护唯一性。从性能角度衡量,选择后面那种方法更好。不过,如果服务器选择实现后面那种方法,就必须保证附加的扩展部分永远不会重用。
2.XML元素<lockdiscovery>
XML元素<lockdiscovery>提供了发现活跃的锁的机制。如果有人试图去给已经被锁定的文件上锁,他会收到指明当前拥有者的XML元素<lockdiscovery>。<lockdiscovery>元素列出了所有未解除的锁和相应的属性。
3.锁的刷新和Timeout首部
为了刷新锁,客户端需要重新提交锁定请求,并把锁定令牌放在If首部中。返回的超时值可能和早先的超时值不同。除了接受服务器给定的超时值,客户端也可以在LOCK请求中指明要求的超时值。这可以通过Timeout首部做到。Timeout首部的语法允许客户端在逗号分隔的列表中描述一些选项。例如:
Timeout : Infinite, Second-86400
服务器没有义务必须满足这些选项。但是,客户端必须在XML元素<timeout>中提供锁定过期的时间。无论怎样,锁定超时只是一个指导值,服务器不一定受其约束。管理员可以手工重设,某些异常事件也可能导致服务器重设锁。客户端应当避免使锁定时间太长。尽管有这些原语,“丢失更新问题”并没有得到完全解决。为了彻底解决这个问题,需要带有版本控制的协作事件系统。
UNLOCK方法
UNLOCK方法用于解除资源上的锁。示例如下:
UNLOCK /ch-publish.fm HTTP/1.1
Host: minstar.inktomi.com
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Lock-Token:
opaquelocktoken:*********
HTTP/1.1204 OK
Server: Microsoft-IIS/5.0
Date: Fri, 10 May 2002 20:56:18 GMT
与大多数资源管理请求一样,要使UNLOCK操作成功,WebDAV要满足两个条件:
第一,先前已经成功完成了摘要认证步骤;
第二,要与在Lock-Token首部中发送的锁定令牌相匹配。如果解锁成功,会向客户端发送204 No Content状态码。
总结
批准锁定时,服务器将域内唯一的令牌返回给客户端。与此相关的规范是opaquelocktoken锁定令牌URI方案。当客户端随后要执行写操作时,它连接到服务器并完成摘要认证步骤。一旦认证完成,WebDAV客户端就发出带有锁定令牌的PUT请求。这样,只有正确的用户加上锁定令牌才可以完成写操作。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)