gpt4 book ai didi

java - Spring MVC,使用 setDisallowedFields 时,一个 Controller 用于 "add"和 "update"?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:36:48 24 4
gpt4 key购买 nike

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

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

目前我有两个 Controller ,除了 InitBinder 方法外,它们的代码可能完全相同。

有什么建议或建议吗? (如果你能给我充分的理由,我愿意接受我也应该维护两个 Controller 的论点)

最佳答案

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

但是,如果您只是简单地禁止“id”字段, Controller 会将 ID 视为 null,这在插入时有效,但在更新时无效(例如,它可能会尝试插入新记录而不是更新,具体取决于什么您正在使用的持久性机制)。因此,您希望 Controller 在请求之间记住域对象的不可编辑值(不仅仅是 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 注释来填充请求中忽略的任何现有字段值。

关于java - Spring MVC,使用 setDisallowedFields 时,一个 Controller 用于 "add"和 "update"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com