Spring MVC,一个控制器,用于“添加”和“更新”什么时候使用setDisallowedFields?

StackOverflow https://stackoverflow.com/questions/826385

  •  05-07-2019
  •  | 
  •  

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

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

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

有任何建议或意见吗? (我愿意接受这样的论点,即如果你能给我很好的理由,我也应该保留两个控制器)

有帮助吗?

解决方案

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

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

其他提示

initBinder 的方法签名接受 HttpServletRequest

protected void initBinder(HttpServletRequest request, 
    ServletRequestDataBinder binder)

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top