Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 在服务器上使用不带状态的SpringWebFlow_Http_Rest_Session State_Spring Webflow_Continuations - Fatal编程技术网

Http 在服务器上使用不带状态的SpringWebFlow

Http 在服务器上使用不带状态的SpringWebFlow,http,rest,session-state,spring-webflow,continuations,Http,Rest,Session State,Spring Webflow,Continuations,我正在阅读ProSpringMVC一书中的SpringWebFlow一章。不幸的是,没有明确的信息,流执行期间的状态在哪里被持久化。我假设它保存在JVM堆中并与会话关联 现在HTTP是一个无状态协议(REST…),我希望使用SpringWebFlow而不保存服务器上的状态(除了会话可能被验证的唯一状态) 一种策略是使用流的每个HTTP请求(隐藏输入)发送整个流的所有参数,从而累积所有必要的参数,直到流完成 通过对已经验证的参数进行签名,可以避免重新验证参数的开销 您知道吗,是否有可能以这种方式使

我正在阅读ProSpringMVC一书中的SpringWebFlow一章。不幸的是,没有明确的信息,流执行期间的状态在哪里被持久化。我假设它保存在JVM堆中并与会话关联

现在HTTP是一个无状态协议(REST…),我希望使用SpringWebFlow而不保存服务器上的状态(除了会话可能被验证的唯一状态)

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

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

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

更新:为什么

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

  • 如果用户使用多个浏览器选项卡进行浏览,则可能会导致不一致的状态、竞争条件或数据丢失
  • 在服务器上存储状态会使多个服务器上的负载平衡变得更加复杂
  • 测试和调试变得更加复杂,因为不能单独测试或分析请求,而只能在以前请求的上下文中进行测试或分析
  • 必须启用Cookie以将服务器会话与请求关联起来
  • 服务器需要同步对服务器端状态的访问
  • 同样依赖于服务器状态的请求的url不包含在流中标记状态或在错误报告中理解状态所需的所有信息
我还没有研究Web流的细节,但我相信,一个人可以拥有相同的编程经验,并且仍然将所有信息保留在请求参数中


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

您可能对检查my bean flow FSM项目(restflow)感兴趣:

尽管它没有使用SpringWebFlow,但我认为它可能有助于回答问题的实质,因为它允许实现无状态服务器协调的流。我启动这个项目是因为我想用SpringWebFlow实现与您几乎相同的功能,但我发现这是不可能的,因为状态存储在会话中(而且REST/json序列化也没有内置)

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

我希望你觉得它有用


编辑:我在此处创建了一个showcase项目:

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