【问题标题】:Use Spring Web Flow without state on the server在服务器上使用没有状态的 Spring Web Flow
【发布时间】:2013-10-22 06:31:14
【问题描述】:

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

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

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

对已验证的参数进行签名可以避免重新验证参数的开销。

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

更新:为什么?

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

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

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

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

【问题讨论】:

  • 你为什么要这样做?您需要坚持的会话太多了吗?
  • 使用 Spring WebFlow 的主要原因之一是它通过使用流来提供会话状态。这些流本质上将保持服务器端状态以执行其功能。如果您正在寻找开发无状态应用程序 - 那么我认为 WebFlow 不是您想要的。使用常规 Spring-MVC 或其他一些技术会更好,就像 Jersey 用于 RESTful Web 服务。
  • 我可以告诉你,在某些时候你可能会遇到 WebFlow 的性能和数据不一致问题,因为 WebFlow 中的每个状态/数据都是序列化/反序列化的。在 WebFlow 中使用许多 REST 请求和数据操作,您将很容易遇到这些请求之间的数据不一致、难以调试和重现的错误。

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


【解决方案1】:

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

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

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

希望对你有用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2015-09-18
    • 1970-01-01
    • 2010-09-10
    • 2010-09-22
    相关资源
    最近更新 更多