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

Tho*_*och 5 rest continuations http session-state spring-webflow

我正在阅读Pro Spring MVC一书中的Spring Web Flow一章。不幸的是,没有明确的信息,流执行过程中的状态将保留在那里。我假设它已保存在JVM Heap中并与会话关联。

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

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

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

您知道吗,是否可以通过这种方式使用Spring Web Flow?有人做过吗?

更新:为什么?

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

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

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

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

Alf*_*esa 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