通过业务操作从数据库中加载尽可能少的数据是一种很好的做法。有时直接使用实体(模型)对象作为命令对象是不安全的。那么选择命令对象的方法应该是什么?为每个视图使用单独的命令对象没有意义。
用例或很好的资源表示赞赏。谢谢。
确实,当使用域对象作为命令对象时,您可能会遇到一些安全问题,Spring 尝试将每个参数绑定到命令字段,因此用户可以在请求中添加额外的参数来修改不应该绑定的字段。如果您采用这种方法,请确保定义要绑定的参数的白名单或黑名单:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAllowedFields("firstName", "lastName");
}
或者
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("id", "creationDate");
}
另一种方法是为表单创建一个额外的类。如果您的域对象与您在视图层中的需要不匹配,则此类可以更好地适应 UI 需求。此类可以封装任何 Web 逻辑、验证和复制到域对象/从域对象复制的逻辑。
所以我想说,只要你设置一个白/黑名单并且你不因为 UI 需要修改它(在域对象中添加额外的字段或额外的逻辑),就可以使用域对象,否则你应该创建一个附加命令对象。