0

我是 Lift 的新手,我正在考虑是否应该更仔细地调查它并开始将它用作我的 Web 开发的主要平台。但是,我很少有“恐惧”,我很乐意首先消除这些“恐惧”。

安全

假设我有以下生成表单的代码段。有几个字段,用户可以只编辑其中的一些。

def form(in : NodeSeq): NodeSeq = {
  val data = Data.get(...)
  <lift:children>
    Element 1: { textIf(data.el1, data.el1(_), isEditable("el1")) }<br />
    Element 2: { textIf(data.el2, data.el2(_), isEditable("el2")) }<br />
    Element 3: { textIf(data.el3, data.el3(_), isEditable("el3")) }<br />
    { button("Save", () => data.save) }
  </lift:children>
}

def textIf(label: String, handler: String => Any, editable: Boolean): NodeSeq =
  if (editable) text(label, handler) else Text(label)

我是否正确,即使isEditable分配给该字段的方法评估为假,也没有漏洞允许用户更改某个字段的值?

表现

在 Lift 中进行表单处理的最佳方法是什么?我真的很喜欢将匿名函数定义为每个字段的处理程序的方式 - 但是它如何扩展?我猜想对于每个处理程序,都会将一个函数及其闭包添加到会话中,并且它会一直保留在那里,直到表单被发回。当涉及到高负载下的服务(比如说每秒 200 个请求)时,它不会引入一些潜在的性能问题吗?这些处理程序什么时候被释放(如果没有重新提交表单并且用户关闭浏览器或导航到另一个页面)?

谢谢!

4

2 回答 2

2

关于安全性,你是对的。创建输入时,将生成处理函数并使用 GUID 标识符存储在服务器端。该功能是特定于会话的,并由您的代码关闭 - 因此其他用户无法访问它并且难以重播。isEditable在您的示例中,由于没有显示任何输入 - 没有生成任何函数,因此如果is 则无法更改值false

至于性能,在单台机器上,Lift 的表现令人难以置信。然而,它确实需要会话感知负载平衡来水平扩展,因为处理程序函数不容易跨机器序列化。要记住的一件事是 Lift 非常灵活,如果需要,您还可以创建无状态表单处理(尽管它不会那么安全)。我从未见过我们创建和部署的应用程序对内存造成太大影响。我没有太多可用的硬统计数据,但在这个线程中,David Pollak 提到demo.liftweb.net当时有 214 个打开的会话消耗大约 100MB 的内存(500K/会话)。

此外,这里是Lift book 的可扩展性章节的链接,其中还包含更多关于安全性的信息。

于 2013-01-30T13:52:01.243 回答
1

sessionShutdown 肯定会清理关闭和所有东西。早些时候——我不知道。无论如何,这并不是一个真正的理论问题——它在很大程度上取决于用户在实践中如何使用 Web 表单。因此,为了获得更广泛的答案,我会在 liftweb 的主要频道上提问——https://groups.google.com/forum/#!forum/liftweb另外 ,如果你可以使用“静态”表格想要。但是 AFAIK 内存没有问题,每个人都在使用表单的主要方法。

如果您不创建处理程序 xml/html - 用户将无法更改数据,这是肯定的。在您的代码中,如果我理解正确(我不确定),您不会在不需要时创建“文本(标签,处理程序)”,所以一切都是安全的。

于 2013-01-30T13:22:37.623 回答