d3:tp04:suite

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
d3:tp04:suite [2025/09/25 22:44] – [Travail à faire] dthevenotd3:tp04:suite [2025/09/28 19:10] (Version actuelle) – [V. Attention : injection SQL, faille XSS (Cross-Site Scripting) en vue…] dthevenot
Ligne 1: Ligne 1:
-====== D3-TP04-suite : Persistance des données (2) ======+====== D3-TP04-suite : Projet gestion de clients - Persistance des données (2) ======
 ===== Contexte ===== ===== Contexte =====
 Nous poursuivons notre application permettant de gestion des clients d'une entreprise de travaux  publics. Cette application doit permettre :  Nous poursuivons notre application permettant de gestion des clients d'une entreprise de travaux  publics. Cette application doit permettre : 
Ligne 9: Ligne 9:
 ===== Travail à faire ===== ===== Travail à faire =====
 Désormais, il faudrait pouvoir permettre la **saisie d'un nouveau clien**t et enregistrer les données saisies  dans la base de données **bdclient**.  Désormais, il faudrait pouvoir permettre la **saisie d'un nouveau clien**t et enregistrer les données saisies  dans la base de données **bdclient**. 
 +
 +==== I. Création du formulaire de saisie  ====
 + 
 +Modifier la page **nouveauClientVue.jsp** en y insérant un formulaire qui devra permettre de saisir toutes les  données de la table client (Sauf l'id qui s'incrémente automatiquement). Ce formulaire lancera la  méthode **doPost** de la servlet **NouveauServlet.java** en cas de soumission. Une fois la création du client  terminée, un message indique à l'utilisateur : //le client no ….. a été créé avec succès// 
 +==== II. Modification de la classe ClientMysql ====
 +Cette classe est dédiée aux requêtes SQL concernant la table client.  
 +
 +La méthode readAll est déjà écrite, il faut désormais ajouter la méthode **create(Client unClient)**. 
 +
 +__Rappel :__ Les requêtes SQL ont besoin d'un objet de type **Statement** qui contiendra la requête SQL. La  méthode **executeUpdate** appliquée à cet objet exécute la requête. Cette méthode retourne le nombre de  lignes affectées par la requête. Les accès à la base de données sont des instructions "à risque", c'est  pourquoi elles seront encadrées par try { …}. 
 +
 +La méthode **getGeneratedKeys** permet de récupérer l'identifiant du client créé. 
 +
 +Exemple de méthode **create** pour l'ajout d'une occurrence dans une table Salarie (avec requête préparée):
 +<code ruby ClientMysql.java>
 +public int create(Client unClient){
 +         int id=-1;
 +         String sql = "INSERT INTO client (nom, prenom, mail) VALUES (?,?,?);";
 +         
 +         try (PreparedStatement prepStmt = theConnection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
 +            
 +            prepStmt.setString(1, unClient.getNom());//le param. 1 est remplacé par le nom du client
 +            prepStmt.setString(2, unClient.getPrenom());
 +            prepStmt.setString(3, unClient.getMail());
 +             
 +            int status = prepStmt.executeUpdate();
 +             // récupération de la clé auto-générée
 +            if (status > 0) {
 +                try (ResultSet result = prepStmt.getGeneratedKeys()) {
 +                    if (result.next()) {  // <-- utiliser next() et pas first()
 +                        id = result.getInt(1);
 +                    }
 +                 }
 +            }
 +            prepStmt.close();
 +            
 +         } catch(SQLException ex){
 +            System.out.println("SQLException:"+ex.getMessage());
 +            System.out.println("SQLState:"+ex.getSQLState());
 +            System.out.println("code Erreur:"+ex.getErrorCode());
 +        }
 +         return id;
 +     }
 +}
 +</code>
 +==== III. Créer la classe NouveauClientForm dans le package com.test.forms ====
 +  
 +Cette classe contrôlera les saisies effectuées, puis permettra la création du client (Cf exemple AuthentifForm.java) 
 +
 +Ajouter la méthode **verifierClient(HttpServletRequest request)** : 
 +  * Avec les données récupérées, créer un nouveau client. 
 +  * Créer une instance de ClientMySQL 
 +  * Appeler la méthode create en lui passant le nouveau client créé 
 +  * Tester le retour de cette méthode et adapter le message dans resultat 
 +  * Tester la création, vérifier l'ajout de l'enregistrement dans la table client 
 +==== IV. Modifier la méthode doPost de la servlet NouveauServlet.java  ====
 + 
 +Cette méthode est exécutée après validation du formulaire de saisie d'un nouveau client. Elle devra  instancier un objet de type **NouveauClientForm**, et appeler la méthode **verifierClient**. Si l'ajout s'est bien  passé, la page de liste des clients s'affichera avec un message indiquant "//L'ajout du client xxx s'est bien  déroulé//". Sinon, la page de saisie du formulaire se réaffichera avec un message d'erreur.
 +
 +==== V. Attention : injection SQL, faille XSS (Cross-Site Scripting) en vue…  ====
 + 
 +Vous avez maintenant 2 formulaires dans votre application, testez -les en écrivant dans une zone de texte : <code><script>alert("Coucou!");</script> </code>
 +
 +  - Que remarquez-vous ? Pourquoi ?
 +  - Vérifier ce qui est sauvegardé dans la base de données. 
 +  - En quoi cela est-il dangereux ? 
 +Pour résoudre ce problème, de type faille xss, il faudra tester les zones saisies, elles ne devront pas  comporter le caractère "<" :
 +  * Utiliser une expression régulière et la méthode matches pour vérifier qu'il n'y a que des caractères
 +
 +Tester. 
  
  
  • d3/tp04/suite.1758833099.txt.gz
  • Dernière modification : 2025/09/25 22:44
  • de dthevenot