Spring MVC, un contrôleur pour & # 8220; ajouter & # 8221; et & # 8220; mettre à jour & # 8221; lors de l'utilisation de setDisallowedFields?

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

  •  05-07-2019
  •  | 
  •  

Question

J'ai donc un formulaire simple à travers lequel je peux soit "ajouter". une nouvelle chose ou "mise à jour" une chose existante.

Ce que je voudrais, c’est d’avoir un contrôleur capable de traiter l’ajout et la mise à jour Au début, cela semble assez simple, jusqu’à ce que j’examine le problème de l’utilisation de setDisallowedFields dans InitBinder, de sorte que le "id" Ce champ n'est pas autorisé lors de l'ajout d'une nouvelle chose.

Actuellement, j'ai deux contrôleurs avec ce qui pourrait être un code identique, à l'exception de la méthode InitBinder.

Des suggestions ou des conseils? (Je suis ouvert à l'argument voulant que je veuille conserver deux contrôleurs également, si vous pouvez me donner de bonnes raisons.)

Était-ce utile?

La solution

En fait, vous devez interdire l’authentification "id". champ à la fois lors de l'ajout ET de la mise à jour. Sinon, un utilisateur malveillant pourrait altérer la valeur de & id; id " paramètre de requête d'une requête de mise à jour et met ainsi à jour un enregistrement différent de celui indiqué par le formulaire (en l'absence de liste de contrôle d'accès ou autre sécurité au niveau du domaine).

Cependant, si vous n'acceptez tout simplement pas le " id " Dans ce champ, le contrôleur considérera l'ID comme étant nul, ce qui fonctionnera lors de l'insertion, mais pas lors de la mise à jour (par exemple, il pourrait essayer d'insérer un nouvel enregistrement au lieu d'être mis à jour, en fonction du mécanisme de persistance que vous utilisez). Vous souhaitez donc que le contrôleur retienne les valeurs non modifiables de votre objet de domaine (pas uniquement les ID, mais tous les champs non autorisés) entre les demandes, de sorte qu'il puisse envoyer toutes les valeurs correctes à la couche service ou à une autre logique applicative. Cette opération est effectuée à l'aide de l'annotation @SessionAttributes au niveau du type, comme suit (les autres annotations sont omises pour plus de clarté):

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

Pour encore plus de sécurité, définissez les champs autorisés plutôt que les champs non autorisés. De toute façon, vous avez besoin de l'annotation @SessionAttributes pour renseigner les valeurs de champ existantes ignorées par la demande.

Autres conseils

La signature de la méthode à initBinder prend dans le HttpServletRequest :

protected void initBinder(HttpServletRequest request, 
    ServletRequestDataBinder binder)

Vous pouvez donc peut-être demander à initBinder () de vérifier les paramètres de la demande pour déterminer si vous devez définir de manière conditionnelle setDisallowedFields ?

(Si cela ne résout pas le problème, je ne comprends peut-être pas le problème correctement ...)

Pour effectuer cette opération avec un seul contrôleur, un objet booléen indique s'il s'agit ou non d'un nouvel objet. Dans onSubmit, je peux ensuite vérifier le booléen pour voir si je dois effectuer une action d'ajout ou de mise à jour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top