我正在阅读 Pro Spring MVC 一书中的 Spring Web Flow 章节。不幸的是,没有明确的信息来保持流执行期间的状态。我假设它保存在 JVM 堆中并与会话相关联。
现在 HTTP 是一种无状态协议(REST ...),我想使用 Spring Web Flow 而不在服务器上保存状态(除了可能对会话进行身份验证的唯一状态)。
一种策略是使用流的每个 HTTP 请求(隐藏输入)发送整个流的所有参数,从而累积所有必要的参数,直到流完成。
通过对已验证参数的签名,可以避免重新验证参数的开销。
你知道,是否有可能以这种方式使用 Spring Web Flow?有人已经这样做了吗?
更新:为什么?
持久化状态不仅违反了 HTTP 作为无状态协议的原则,而且也存在实际问题:
- 如果用户使用多个浏览器选项卡进行浏览,那么这可能会导致不一致的状态、竞争条件或数据丢失。
- 在服务器上存储状态会使多台服务器上的负载平衡更加复杂。
- 测试和调试变得更加复杂,因为不能孤立地测试或分析请求,而只能在先前请求的上下文中进行测试或分析。
- 必须启用 Cookie 才能将服务器会话与请求相关联。
- 服务器需要同步访问服务器端的状态。
- 同样取决于服务器状态的请求的 url 不包含为流中的状态添加书签或在错误报告中理解它所需的所有信息。
我还没有查看 Web Flow 的详细信息,但我相信人们可以拥有相同的编程经验,并且仍然将所有信息保留在请求参数中。
更新:我现在了解到我请求的流处理风格有一个名称:Continuations。延续一词在函数式编程中更为常见,但将这一想法应用于 HTTP 交互显然并不少见。