Créer une page de connexion pour une application web

Signaler
Messages postés
143
Date d'inscription
vendredi 29 mai 2015
Statut
Membre
Dernière intervention
5 septembre 2020
-
Messages postés
16030
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
5 septembre 2020
-
Bonjour,

Pour un projet je dois réaliser une application web en Java sous IDE ECLIPSE avec Driver Jdbc. La premiere étape est de permettre à l'utilisateur de se connecter, et pour moi c'est le flou total...

Dans ma couche DAL j'ai construit la classe UtilisateurDAOJdbcImpl :
public class UtilisateurDAOJdbcImpl implements UtilisateurDAO {

private static final String SQL_SELECT_LOGIN="select * from UTILISATEURS where pseudo=?, mot_de_passe=?";

public Utilisateur selectByLogin(String pseudo, String motDePasse) throws BusinessException {
Utilisateur profil = null;
try(Connection cnx = ConnectionProvider.getConnection()){
PreparedStatement pstmt = cnx.prepareStatement(SQL_SELECT_LOGIN);
pstmt.setString(1, pseudo);
pstmt.setString(2, motDePasse);
ResultSet rslt = pstmt.executeQuery();
if(rslt.next()) {
profil = map(rslt);
}
}catch (Exception e) {
e.printStackTrace();
BusinessException be = new BusinessException();
be.ajouterErreur(CodeResultatDAL.LECTURE_OBJET_ECHEC);
throw be;
}
if(profil==null) {
BusinessException be = new BusinessException();
be.ajouterErreur(CodeResultatDAL.ERREUR_LOGIN);
throw be;
}
return profil;
}

}



Puis dans ma couche BLL j'ai créé une classe UtilisateurManager avec le code suivant :
public class UtilisateurManager {

private UtilisateurDAO utilisateurDAO;

public UtilisateurManager(){
this.utilisateurDAO = DAOFactory.getUtilisateurDAO();
}

public Utilisateur seConnecter(String pseudo, String motDePasse) throws BusinessException {
if(pseudo!=null || motDePasse!=null) {
BusinessException be = new BusinessException();
be.ajouterErreur(CodeResultatBLL.SAISIE_LOGIN_MP_OBLIGATOIRE);
throw be;
}
if(utilisateurDAO.selectByLogin(pseudo, motDePasse)==null) {
BusinessException be = new BusinessException();
be.ajouterErreur(CodeResultatBLL.SAISIE_LOGIN_MP_UNKNOWN);
throw be;
}

return this.utilisateurDAO.selectByLogin(pseudo, motDePasse);
}

}


Ensuite j'ai créé une Servlet :
@WebServlet("/ServletConnexion")
public class ServletConnexion extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/login.jsp");
rd.forward(request,response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String pseudo=null;
String motDePasse=null;
List<Integer> listeCodesErreurs = new ArrayList<>();

pseudo = request.getParameter("pseudo");
if(pseudo==null || pseudo.trim().isEmpty()) {
listeCodesErreurs.add(CodeResultatServlet.FORMAT_IDENTIFIANT_ERREUR);
}

motDePasse = request.getParameter("motDePasse");
if(motDePasse==null || motDePasse.trim().isEmpty()) {
listeCodesErreurs.add(CodeResultatServlet.FORMAT_MOT_DE_PASSE_ERREUR);
}

if(listeCodesErreurs.size()>0)
{
//Je renvoie les codes d'erreurs
request.setAttribute("listeCodesErreurs",listeCodesErreurs);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/login.jsp");
rd.forward(request, response);
}
else {
//j'affiche le profil
UtilisateurManager utilisateurManager = new UtilisateurManager();
try {
utilisateurManager.seConnecter(pseudo, motDePasse);
RequestDispatcher rd = request.getRequestDispatcher("/ServletListeEncheres");
rd.forward(request, response);
} catch(BusinessException be) {
be.printStackTrace();
request.setAttribute("listeCodesErreurs", be.getListeCodesErreur());
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/login.jsp");
rd.forward(request,response);
}
}
}

}


Et enfin la JSP "login.jsp" pour afficher la page de connexion:
<title>Page de connexion</title>
</head>
<body>
<div class="col-sm-6 text-align:left">
<h1>ENI-Encheres</h1>
</div>
<div class="container col-sm-6 col-sm-offset-3">
<form action="fr.eni.javaee.projet_encheres.servlets/ServletConnexion" method="post">
<fieldset class="form-group">
<label for="pseudo">Identifiant </label>
<input type="text" name="identifiant" id="identifiant" size="30" maxlength="30" required="required" autofocus="autofocus" autocomplete="off">
</fieldset>
<fieldset class="form-group">
<label for="motDePasse">Mot de Passe</label>
<input type="password" name="motDePasse" id="motDePasse" size="30" maxlength="30" required="required" autocomplete="off">
</fieldset>
<fieldset class="form-group">
<input type="submit" value="Connexion">
</fieldset>
</form>
</div>
</body>


Quelqu'un peut il m'aider à reconstruire mon code, car comme je m'y attendais ça ne fonctionne pas du tout ...

Merci d'avance pour votre aide

6 réponses

Messages postés
16030
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
5 septembre 2020
2 664
Bonjour,

Je n'ai pas de PC sous la main et il manque de toute façon trop de code que tu ne nous as pas transmis pour tester, mais est-ce que tu pourrais nous lister tous les fichiers (pas leur contenu) que tu as créé afin de voir dans quels dossiers ils sont.
Par exemple en utilisant la commande
jar tvf tonAppliWeb.war
Messages postés
143
Date d'inscription
vendredi 29 mai 2015
Statut
Membre
Dernière intervention
5 septembre 2020

Bonjour,

voici la liste des fichiers (je n'ai pas reussie à utiliser la commande).


merci
Messages postés
16030
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
5 septembre 2020
2 664
Déjà dans le META-INF tu ne devrais avoir pas avoir de fichier HTML ou CSS, ils devraient être dans WebContent avec jquery et bootstrap.

Est-ce que tu pourrais copier-coller le contenu des fichiers web.xml et contexte.xml

Après si tu pouvais expliquer le problème que tu as, si tu as des erreurs au démarrage par exemple, savoir lesquelles c'est.

De plus, est ce que tu es absolument contraint de faire un serveur à l'ancienne avec Eclipse ou est ce que tu as un peu de liberté ?
Vu ton code (JSP &co) je te conseillerai cette architecture : Exemple simple d'application JSTL, ça n'empêche pas bien sûr d'utiliser Eclipse et ton code ne changerai pas, mais l'exécution du serveur pour tester le programme sera grandement facilité.
Messages postés
143
Date d'inscription
vendredi 29 mai 2015
Statut
Membre
Dernière intervention
5 septembre 2020

Ok j'ai modifié l'emplacement des fichiers.

Voici le code du fichier web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>ProjetEncheres</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>


Et celui du fichier contexte.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Ressource
name ="jdbc/pool_cnx"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
type="java.sql.DataSource"
url="jdbc:sqlserver://localhost;databasename=PROJET_ENCHERES"
username="root"
password="root"

maxTotal="1000"
maxIdle="30"
maxWaitMillis="10000"

/>

</Context>


Quand je lance ma Servlet ma page web s'affiche, et quand j’inscris un pseudo et un mot de passe et que je clique sur connexion il me renvoi un page "404 Not Found servletconnexion indisponible"

Merci
Messages postés
16030
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
5 septembre 2020
2 664
Dans ta JSP cette ligne est incorrecte :
<form action="fr.eni.javaee.projet_encheres.servlets/ServletConnexion" method="post">

La classe que tu dois appeler doit être configurée dans le web.xml et c'est l'URL configurée que tu dois appeler dans le form :
    <servlet>
        <display-name>Connexion</display-name>
        <servlet-name>ConnexionServlet</servlet-name>
        <servlet-class>fr.eni.javaee.projet_encheres.servlets/ServletConnexion</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ConnexionServlet</servlet-name>
        <url-pattern>/connexion</url-pattern>
    </servlet-mapping>

<form action="connexion" method="post">
Messages postés
143
Date d'inscription
vendredi 29 mai 2015
Statut
Membre
Dernière intervention
5 septembre 2020

J'ai effectué les modifications, mais toujours le même code erreur "404 La ressource demandée [/connexion] n'est pas disponible"
Messages postés
16030
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
5 septembre 2020
2 664
Je me suis trompé en copiant collant, il ne faut pas mettre de / mais un . pour le nom de la classe
<servlet-class>fr.eni.javaee.projet_encheres.servlets.ServletConnexion</servlet-class>
Messages postés
143
Date d'inscription
vendredi 29 mai 2015
Statut
Membre
Dernière intervention
5 septembre 2020

ok j'ai modifié mais toujours la meme erreur
Messages postés
16030
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
5 septembre 2020
2 664
Je n'avais pas vu que tu utilisais les annotations @WebServlet donc on va partir là dessus.

Supprimes la servlet du fichier web.xml (au passage tu peux supprimer les welcome-file aussi)

Avec l'annotation
@WebServlet("/ServletConnexion")
c'est donc
<form action="ServletConnexion" method="post">
qu'il faudrait indiquer.
Messages postés
143
Date d'inscription
vendredi 29 mai 2015
Statut
Membre
Dernière intervention
5 septembre 2020

ah enfin ça fonctionne ! Merci !
Enfin ca fonctionne... disons que je n'ai plus de page d'erreur, c'est déjà un bon début!

Par contre mon code pour établir la connexion doit avoir beaucoup d'erreurs car quand j'indique un pseudo et mp qui font pourtant bien partis de ma base de données il me réaffiche ma page de connexion...

Il faudrait que j'utilise un objet HttpSession, ainsi qu'un mot de passe de type "ecryptedPassword" mais honnetement je n'ai aucune idée de comment mettre ça en place dans mon Modèle DAO.
Des conseils ?

Merci beaucoup
Messages postés
16030
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
5 septembre 2020
2 664
Si tu retournes sur la page de connexion c'est que tu rentres dans le
catch(BusinessException be)
donc tu dois avoir la stack trace de l'exception qui s'affiche, ça permet de cerner le problème.

Dans le code d'exemple que j'ai cité tout à l'heure il y a une utilisation de HttpSession dans ResultAction.java tu devrais regarder comment c'est fait.

Quant à la sécurisation du mot de passe, tu peux regarder les MessageDigest, exemple ici : SHA-256 Hashing in Java