在服务器上使用没有状态的Spring Web Flow

时间:2013-10-22 06:31:14

标签: http rest session-state spring-webflow continuations

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

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

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

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

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

更新:为什么?

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

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

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

更新:我现在已经了解到我所请求的流处理方式有一个名称:Continuations。术语延续在函数式编程中更常见,但将这个想法适应HTTP交互显然并不罕见。

1 个答案:

答案 0 :(得分: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