Spring MVC, un controlador para & # 8220; add & # 8221; y & # 8220; actualizar & # 8221; cuando se usa setDisallowedFields?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Entonces tengo una forma simple a través de la cual puedo " agregar " una nueva Cosa, o " actualizar " una cosa existente.

Lo que me gustaría es tener un controlador que pueda procesar tanto la adición como la actualización. Al principio, esto parece bastante simple, hasta que considero el problema de usar setDisallowedFields en mi InitBinder para que el " id " El campo no está permitido cuando se agrega una Cosa nueva.

Actualmente tengo dos controladores con lo que podría ser un código idéntico, excepto por el método InitBinder.

¿Alguna sugerencia o consejo? (Estoy abierto al argumento de que también quiero mantener dos controladores, si me puede dar buenas razones)

¿Fue útil?

Solución

En realidad, deberías rechazar el " id " campo tanto al agregar y actualizar. De lo contrario, un usuario malintencionado podría alterar el valor del " id " solicite el parámetro de una solicitud de actualización y, por lo tanto, actualice un registro diferente al que se muestra en el formulario (suponiendo que no haya ACL u otra seguridad de nivel de dominio).

Sin embargo, si simplemente rechaza el " id " En este campo, el controlador tratará el ID como nulo, lo que funcionará cuando se inserte pero no cuando se actualice (por ejemplo, podría intentar insertar un nuevo registro en lugar de actualizar, dependiendo del mecanismo de persistencia que esté usando). Por lo tanto, desea que el controlador recuerde los valores no editables de su objeto de dominio (no solo las ID, sino todos los campos no permitidos) entre las solicitudes para que pueda enviar todos los valores correctos a la capa de servicio u otra lógica empresarial. Esto se hace usando la anotación @SessionAttributes a nivel de tipo, como se indica a continuación (otras anotaciones se omiten para mayor claridad):

@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
}

Para una seguridad aún mejor, establezca los campos permitidos en lugar de los campos no permitidos. De cualquier manera, necesita la anotación @SessionAttributes para completar los valores de campo existentes que se ignoran en la solicitud.

Otros consejos

La firma del método para initBinder toma el HttpServletRequest :

protected void initBinder(HttpServletRequest request, 
    ServletRequestDataBinder binder)

Entonces, tal vez pueda hacer que initBinder () verifique los parámetros de la solicitud para determinar si debería establecer de manera condicional setDisallowedFields ?

(Si esto no ayuda, quizás no esté entendiendo el problema correctamente ...)

La forma en que hago esto con un solo controlador es tener un booleano en mi objeto de comando que indique si es un objeto nuevo o no. En onSubmit, puedo verificar el booleano para ver si necesito realizar una acción de agregar o actualizar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top