3

所以我有一个简单的表格,我可以通过它“添加”一个新事物,或者“更新”一个现有的事物。

我想要的是拥有一个可以同时处理添加和更新的控制器。一开始这似乎很简单,直到我考虑在我的 InitBinder 中使用 setDisallowedFields 的问题,以便在添加新事物时不允许使用“id”字段。

目前我有两个控制器,除了 InitBinder 方法之外,它们的代码可能相同。

有什么建议或建议吗?(如果你能给我充分的理由,我也愿意维护两个控制器的论点)

4

3 回答 3

4

实际上,您应该在添加和更新时都禁止“id”字段。否则,恶意用户可能会篡改更新请求的“id”请求参数的值,从而将不同的记录更新为表单显示的记录(假设没有 ACL 或其他域级安全性)。

但是,如果您只是禁止“id”字段,控制器会将 ID 视为 null,这将在插入时起作用,但在更新时不起作用(例如,它可能会尝试插入新记录而不是更新,这取决于您使用的持久性机制'正在使用)。因此,您希望控制器在请求之间记住域对象的不可编辑值(不仅是 ID,还包括所有不允许的字段),以便它可以将所有正确的值发送到服务层或其他业务逻辑。这是使用类型级别的 @SessionAttributes 注释完成的,如下所示(为清楚起见,省略了其他注释):

@SessionAttributes("thing") // the name of your domain object in the model
public class ThingController {

    public void setDisallowedFields(WebDataBinder binder) {
        binder.setDisallowedFields("id", "someOtherUneditableField");
    }

    // request handling methods go here as before
}

为了更好的安全性,设置允许的字段而不是不允许的字段。无论哪种方式,您都需要 @SessionAttributes 注释来填充请求中忽略的任何现有字段值。

于 2010-02-11T01:29:31.480 回答
2

initBinder要接受的方法签名HttpServletRequest

protected void initBinder(HttpServletRequest request, 
    ServletRequestDataBinder binder)

所以也许你可以initBinder()检查请求参数来确定你是否应该有条件地设置setDisallowedFields

(如果这没有帮助,也许我没有正确理解这个问题......)

于 2009-05-05T18:59:36.533 回答
1

我使用单个控制器执行此操作的方法是在我的命令对象上有一个布尔值,指示它是否是一个新对象。在 onSubmit 中,我可以检查布尔值以查看是否需要执行添加或更新操作。

于 2009-05-06T07:35:57.527 回答