2

我正在开发我的第一个 Spring 3 webapp。在 Spring 2 中,我们曾经让 formBackingObject 从数据库中加载数据,然后让 Spring 绑定更新一些字段,然后 onSubmit 会持久化这些更改。

在 Spring 3 中,我似乎有两个选择:

  1. 让用户编辑 100% 的持久对象。这意味着对象的 ID 需要是隐藏字段
  2. 创建一个包含可编辑数据的表单对象,然后在提交时将其映射到持久对象

第一个选项并不是一个真正的选项,我们不能让用户编辑所有字段,我们宁愿不要在任何能够按 F12 的人都可以更改值的隐藏字段中显示数据。

第二种选择似乎是一种不错的设计方法。但是,它似乎需要基本上克隆每个可编辑的持久类。

@Entity
public class Company {
    private String uuid; // not editable!
    .. 30 other properties, 2 are not editable
}

public class CompanyForm {
    .. 28 of above properties
}

然后一些映射机制有很多

public void map(CompanyForm cf, Company c) {
    cf.setName(c.getName());
    .. 27 other set(get())
}

我祈祷这不是 Spring 的 MVC 绑定的“设计”方法。但是,到目前为止,我发现的所有教程都非常琐碎,并且从上面实现了选项 1。有人对实施选项 2 有什么建议吗?

谢谢,西蒙

4

3 回答 3

2

数据绑定器 API

请注意,未能设置允许的字段数组可能会带来安全隐患。例如,在 HTTP 表单 POST 数据的情况下,恶意客户端可以尝试通过提供表单上不存在的字段或属性的值来破坏应用程序。在某些情况下,这可能会导致在命令对象或其嵌套对象上设置非法数据。因此,强烈建议在 DataBinder 上指定allowedFields属性。

您可以将它与选项 1 一起使用

于 2013-10-21T17:14:27.157 回答
0

一种实用的方法是忽略更新语句中的不可编辑字段。

于 2014-05-12T10:54:56.023 回答
0

实际上,我过去通过使用 @ModelAttribute 注释并检测请求中的 PK 来规避这一点,如果这样做,Spring 将使用从 @ModelAttribute 返回的对象并自动将提交的对象复制到它。

这是一种黑客攻击,但对于进来维护代码的人来说并不明显。

于 2014-05-16T17:16:58.147 回答