6

某些表格太复杂,无法将它们放在一页上。例如,如果表单涉及大量结构化数据,例如在地图上选择位置、在日历小部件中安排事件,或者根据之前的输入使表单的某些部分发生变化,那么能够将某个表单拆分为多个页面。

这对于动态网页和 Javascript 很容易做到,因为只需创建一个带有不同页面的选项卡小部件,实际提交的表单将包含整个选项卡小部件及其所有输入字段,从而POST为整个操作产生一个请求.

但是,有时生成某些输入字段需要很长时间;即使在页面生成之后,它们甚至可能是计算密集型的,对低端计算机用户的浏览器造成负担。此外,创建根据早期输入自行调整的表单变得困难或不可能。

因此,有必要将某个表单拆分为多个整页请求。

这可能很困难,特别是因为表单的第一页将POST发送到/location/a,这将发出重定向到客户端/location/b并请求GET客户端。将存储的表单数据从POST /location/ato传递GET /location/b是困难所在。

Spring Web Flow(Spring 框架的一个子项目,以其依赖注入功能而闻名)的创建者 Erwin Vervaet 曾经写过一篇博客文章,演示了该框架中的此功能,并将其与实现类似功能的 Lift Web 框架进行了比较. 然后他提出了对其他 Web 框架的挑战,这将在后面的文章中进一步描述。

Yesod 将如何面对这个问题,尤其是考虑到它基于 REST 的无状态特性?

4

1 回答 1

3

首先,目前还没有预先构建的解决方案(至少我知道)。而且我不熟悉提到的其他框架如何解决问题。所以我在这里说的几乎是猜想。但是,我相当肯定它会起作用。

这里问题的关键是将页面 A 的 POST 参数编码到页面 B 的 GET 请求中。最简单的方法是将页面 A 的 POST 参数粘贴到会话变量中。但是,这样做会彻底破坏导航:后退/前进根本不会像描述的那样工作。

所以我们回到 REST:我们需要将 POST 参数编码到请求本身。这实际上意味着将信息放在请求的路径或查询字符串中。查询字符串可能是最有意义的。

我担心将原始 POST 参数放入查询字符串中,因为这将允许任何代理服务器轻松窥探内容。所以我想利用来自客户端会话的现有密码学。换句话说,我们将在查询字符串参数中粘贴之前提交的表单的签名、加密版本。

为了使它更具体一点:

  • 用户通过 GET 转到页面 A。
  • 用户通过 POST 提交页面 A。
  • 服务器验证表单提交,获取一个值,序列化它,加密/散列它。
  • 用户作为 GET 被重定向到页面 B,查询字符串参数包含来自页面 A 的加密/散列值。
  • 根据需要多次继续此过程。
  • 在最后一页,您可以解密查询字符串参数并提交所有表单。

如果有人感兴趣,这看起来将是一个有趣的附加包。

于 2012-07-23T02:41:27.700 回答