5

我正在阅读 Pro Spring MVC 一书中的 Spring Web Flow 章节。不幸的是,没有明确的信息来保持流执行期间的状态。我假设它保存在 JVM 堆中并与会话相关联。

现在 HTTP 是一种无状态协议(REST ...),我想使用 Spring Web Flow 而不在服务器上保存状态(除了可能对会话进行身份验证的唯一状态)。

一种策略是使用流的每个 HTTP 请求(隐藏输入)发送整个流的所有参数,从而累积所有必要的参数,直到流完成。

通过对已验证参数的签名,可以避免重新验证参数的开销。

你知道,是否有可能以这种方式使用 Spring Web Flow?有人已经这样做了吗?

更新:为什么?

持久化状态不仅违反了 HTTP 作为无状态协议的原则,而且也存在实际问题:

  • 如果用户使用多个浏览器选项卡进行浏览,那么这可能会导致不一致的状态、竞争条件或数据丢失。
  • 在服务器上存储状态会使多台服务器上的负载平衡更加复杂。
  • 测试和调试变得更加复杂,因为不能孤立地测试或分析请求,而只能在先前请求的上下文中进行测试或分析。
  • 必须启用 Cookie 才能将服务器会话与请求相关联。
  • 服务器需要同步访问服务器端的状态。
  • 同样取决于服务器状态的请求的 url 不包含为流中的状态添加书签或在错误报告中理解它所需的所有信息。

我还没有查看 Web Flow 的详细信息,但我相信人们可以拥有相同的编程经验,并且仍然将所有信息保留在请求参数中。

更新:我现在了解到我请求的流处理风格有一个名称:Continuations。延续一词在函数式编程中更为常见,但将这一想法应用于 HTTP 交互显然并不少见。

4

1 回答 1

0

您可能有兴趣查看我的 bean flow FSM 项目(restflow): https ://github.com/alfonso-presa/restflow

虽然它不使用 Spring WebFlow,但我认为它可能有助于回答问题的精神,因为它允许实现无状态服务器编排流。我开始这个项目是因为我想用 spring WebFlow 做几乎和你一样的东西,但我发现这是不可能的,因为状态存储在会话中(而且 REST/json 序列化也没有内置)。

它的主要目的是制作一个状态机(就像 WebFlow 一样),但它的状态存储在一个 bean 中,您可以将其保存在分布式存储中,或者轻松签名或加密并发送回客户端作为下一个请求的延续。

希望对你有帮助。

编辑:我在这里创建了一个展示项目:https ://github.com/alfonso-presa/restflow-spring-web-sample

于 2015-08-19T19:12:18.510 回答