6. Locking (锁定)
锁定资源的能力提供了一种序列化对该资源访问的机制。使用锁,创作客户端可以提供合理的保证,确保另一个主体不会在编辑时修改资源。通过这种方式,客户端可以防止"更新丢失" (Lost Update) 问题。
本规范允许锁在两个客户端指定的参数上变化:涉及的主体数量 (排他锁 vs. 共享锁) 和要授予的访问类型。本文档仅定义了一种访问类型的锁定:写入 (Write)。然而,语法是可扩展的,并允许最终为其他访问类型指定锁定。
6.1 Lock Model (锁定模型)
本节对WebDAV锁定进行非规范性描述。
锁通过用锁令牌 (Lock Token) 标识。锁令牌是URL,可以通过HTTP传输。一个锁令牌仅与一个锁相关联。
锁可以是排他的 (Exclusive) 或共享的 (Shared)。锁的类型决定了服务器如何处理对锁定资源的请求:
排他锁 (Exclusive Lock):
- 只有创建锁的主体可以修改资源
- 防止任何其他主体获取冲突的锁
共享锁 (Shared Lock):
- 多个主体可以持有共享锁
- 所有持有共享锁的主体都可以修改资源
- 防止未持有锁的主体修改资源
锁可以有不同的作用域 (Scope):
- 直接锁定 (Direct Lock): 锁直接应用于资源
- 深度锁定 (Depth Lock): 锁应用于资源及其所有成员
对于集合,可以指定深度 (Depth):
- Depth: 0: 仅锁定集合本身
- Depth: infinity: 锁定集合及其所有成员(递归)
6.2 Exclusive vs. Shared Locks (排他锁与共享锁)
最常见的锁类型是排他锁 (Exclusive Lock)。排他锁的目的是强制执行特定主体的编辑策略。排他锁的常见用途是在长时间的创作会话期间阻止不同主体修改资源。
共享锁 (Shared Lock) 旨在支持协作创作,其中一组主体需要同时修改资源。共享锁的关键特征是多个主体可以持有共享锁,但排他锁会排除所有其他锁。
锁兼容性表:
| 当前状态 | 共享锁请求 | 排他锁请求 |
|---|---|---|
| 无锁 | ✅ 可以 | ✅ 可以 |
| 共享锁 | ✅ 可以 | ❌ 不可以 |
| 排他锁 | ❌ 不可以 | ❌ 不可以 |
6.3 Required Support (必需支持)
服务器必须 (MUST) 支持排他写锁 (Exclusive Write Lock)。
服务器可以 (MAY) 支持共享写锁 (Shared Write Lock)。如果服务器不支持共享写锁,当客户端请求共享写锁时,服务器必须 (MUST) 返回错误。
6.4 Lock Creator and Privileges (锁创建者和权限)
锁与创建锁的主体相关联。只有持有适当锁令牌的主体才能解锁资源。这确保了锁的创建者对锁的生命周期具有控制权。
创建锁的主体需要具有在资源上创建锁的权限。具体的权限要求由服务器的访问控制策略确定。
6.5 Lock Tokens (锁令牌)
锁令牌 (Lock Token) 是唯一标识锁的URL。锁令牌通常使用URI方案 opaquelocktoken: (参见附录C)。
锁令牌的特性:
- 全局唯一性: 每个锁令牌在全球范围内是唯一的
- 不可预测性: 锁令牌应该是不可预测的,以防止未经授权的访问
- URL格式: 锁令牌是有效的URL
示例锁令牌:
opaquelocktoken:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
客户端通过以下方式提交锁令牌:
- 在
If头中包含锁令牌 - 在
Lock-Token头中包含锁令牌 (仅用于UNLOCK方法)
6.6 Lock Timeout (锁超时)
锁具有有限的生命周期。服务器为每个锁分配超时值,超时后锁会自动过期。
超时特性:
- 客户端可以在
Timeout请求头中建议超时值 - 服务器可以忽略客户端的建议并分配自己的超时值
- 服务器必须 (MUST) 在锁响应中返回实际的超时值
- 客户端可以通过刷新锁来延长锁的生命周期
超时格式:
Timeout: Second-4100
Timeout: Infinite
最佳实践:
- 服务器应该 (SHOULD) 允许客户端刷新锁
- 客户端应该 (SHOULD) 定期刷新长期锁
- 服务器可以 (MAY) 对锁超时施加限制
6.7 Lock Capability Discovery (锁能力发现)
客户端可以通过以下方式发现服务器的锁定能力:
- OPTIONS方法: 检查
DAV头是否包含级别2支持 - PROPFIND方法: 查询
DAV:supportedlock属性
DAV:supportedlock 属性列出了服务器在资源上支持的锁类型。
6.8 Active Lock Discovery (活动锁发现)
客户端可以通过查询 DAV:lockdiscovery 属性来发现资源上的活动锁。
DAV:lockdiscovery 属性包含以下信息:
- 锁类型 (排他或共享)
- 锁作用域 (写锁)
- 锁深度 (0或infinity)
- 锁所有者信息
- 锁超时值
- 锁令牌 (如果客户端是锁的持有者)
安全考虑: 服务器应该 (SHOULD) 仅向授权的客户端披露锁令牌,以防止未经授权的锁操作。