Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC,一个控制器用于;加上「;及;更新;当使用setDisallowedFields时?_Java_Spring Mvc - Fatal编程技术网

Java Spring MVC,一个控制器用于;加上「;及;更新;当使用setDisallowedFields时?

Java Spring MVC,一个控制器用于;加上「;及;更新;当使用setDisallowedFields时?,java,spring-mvc,Java,Spring Mvc,所以我有一个简单的表单,通过它我可以“添加”一个新的东西,或者“更新”一个现有的东西 我想要的是有一个控制器,可以处理添加和更新。一开始,这似乎很简单,直到我考虑在我的InBut结结体中使用StEdStaseDeField的问题,这样当添加一个新的东西时,“ID”字段是不允许的。p> 目前我有两个控制器,除了InitBinder方法外,它们的代码可能是相同的 有什么建议或建议吗?(如果你能给我充分的理由,我愿意接受这样的观点,即我还应该维护两个控制器)initBinder的方法签名包含HttpS

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

我想要的是有一个控制器,可以处理添加和更新。一开始,这似乎很简单,直到我考虑在我的InBut结结体中使用StEdStaseDeField的问题,这样当添加一个新的东西时,“ID”字段是不允许的。p> 目前我有两个控制器,除了InitBinder方法外,它们的代码可能是相同的


有什么建议或建议吗?(如果你能给我充分的理由,我愿意接受这样的观点,即我还应该维护两个控制器)

initBinder的方法签名包含
HttpServletRequest

protected void initBinder(HttpServletRequest request, 
    ServletRequestDataBinder binder)
因此,也许您可以让
initBinder()
检查请求参数,以确定是否应该有条件地设置
setDisallowedFields


(如果这没有帮助,可能是我没有正确理解问题…

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

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

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

为了获得更好的安全性,请设置允许的字段而不是不允许的字段。无论哪种方式,您都需要@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
}