2013-10-22 36 views
3

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

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

一个策略是发送整个流程的所有参数与流量(隐藏输入)的每个HTTP请求,并因此累积所有必要的参数,直到流程完成。

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

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

更新:为什么?

坚持国家不仅违反了HTTP作为无状态协议的原则,但也有实际问题:

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

我还没有看过Web Flow的细节,但我确信可以有相同的编程经验,并且仍然保留请求参数中的所有信息。

更新:我已经了解到,我所要求的流动处理风格有一个名称:Continuations。术语continuation在函数式编程中更常见,但将这个想法适配到HTTP交互中显然并不少见。

+0

你为什么想这么做?你有太多的会话需要坚持吗? –

+2

使用Spring WebFlow的主要原因之一是它通过使用流提供_conversational state_。这些流程本质上将维护服务器端状态以执行其功能。如果你想开发一个无状态的应用程序 - 那么我不认为WebFlow是你想要的。对于REST风格的Web服务,您最好使用常规的Spring-MVC或其他一些技术,如[Jersey](https://jersey.java.net/)。 –

+0

我可以告诉你,在某些时候,你可能会遇到WebFlow的性能和数据不一致问题,因为WebFlow中的每个状态/数据都是序列化/反序列化的。通过WebFlow中的许多REST请求和数据操作,您将很容易遇到这些请求之间数据不一致的问题,难以调试和复制的错误。 –

回答

0

您可能会感兴趣的检查我的豆流动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