На самом деле, вы должны запретить поле "id" как при добавлении, так и при обновлении. В противном случае злоумышленник может изменить значение параметра запроса «id» в запросе на обновление и тем самым обновить другую запись, указанную в форме (при условии, что ACL-списки или другая защита на уровне домена) отсутствуют.
Однако, если вы просто запретите поле «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 для заполнения любых существующих значений полей, игнорируемых в запросе.