Tomcat/Servlet - Authentifier l'utilisateur ??

Tomcat/Servlet - Authentifier l'utilisateur ?? - Java - Programmation

Marsh Posté le 15-02-2005 à 09:14:15    

En fait, mon problème est unique, et vous avez deux manières de pouvoir m'aider... C'est chouette, hein ?  :)  
 
Bon alors voilà : je développe un site intranet qui va piocher des données dans une base de données, et je dois utiliser java et ses servelts. Débutant en java, j'ai réussi à faire avancer un peu le problème. Mais là je bloque : je dois authentifier des utilisateurs. Et pour ce faire, je suis parti de l'idée suivante :
 
Je vérifie un couple user/pwd dans une base de données. Si c'est invalide, bien évidemment ca ne marche pas. Si cela est OK, je lui crée une session. Donc  si l'utilisateur a une session, c'est qu'il est identifié.
 
Le problème est qu'il faut qu'a chaque page, on vérifie qu'il s'agisse bien du bon utilsateur (tous n'ont pas accès aux memes pages), et que la  session n'a pas expirée.
 
Donc voici comment je procède : il passe par une page d'authentification qui lui donne un id session, et le stocke dans un cookie.
A chaque consultation de page, je cherche le cookie, je le compare avec ce qu'a le serveur en mémoire, et si ce n'est pas égal => dehors.
 
Et mon "prb" : cela fait beaucoup de code au début de chaque page : je souhaite donc "externaliser" la tache de début de page.
Et donc mon code "souhaité" serait le suivant :

Code :
  1. boolean session_valide=pageExterne.isSessionValide();
  2. if (!session_valide) {retour à l'identification}
  3. else {code de la page}


 
Et je n'arrrive pas à récuperer ce boolen de ma page externe... J'ai sans cesse des prbs de méthodes/variables statiques-non statiques
 
Je vous propose la structure de code suivant pour la page externe.

Code :
  1. imports......
  2. public class ValiderSession extends HttpServlet
  3. {
  4. //Par défaut, on invalide la session
  5. public boolean is_session_valide=false;
  6. public void service (HttpServletRequest req, HttpServletResponse res)
  7. throws ServletException, IOException
  8. {
  9.  HttpSession session = req.getSession();
  10.  String uid_current=session.getId();
  11.  String uid_log="";
  12.  String id_user="";
  13.  res.setContentType ("text/html" );
  14.  PrintWriter out = res.getWriter();
  15.  try { //de la confirmation de session
  16.   Cookie[] les_cookies_client = req.getCookies();
  17.   boolean cookie_uid_trouve=false;
  18.   for(int i=0; i <les_cookies_client.length; i++) {
  19.    Cookie cookie_actuel = les_cookies_client[i];
  20.    if(cookie_actuel.getName().equals("uid_log" )) {
  21.     uid_log=cookie_actuel.getValue();
  22.     cookie_uid_trouve=true;
  23.    }
  24.    if(cookie_actuel.getName().equals("nom_user" )) {
  25.     id_user=cookie_actuel.getValue();
  26.    }
  27.   }
  28.   //En sortant du for, si le cookie n'a pas été trouvé, y'a un prb
  29.   if(!cookie_uid_trouve) out.println("Aucune Cookie détécté : Cookie disparu !" );
  30.   //Si on est là, c que le cookie a été trouvé, et que y'a un prb...
  31.   if(!(uid_log.equals(uid_current))) {
  32.    out.println("Waring votre session pour le log était :"+uid_log+" alors que la session actuelle est "+uid_current);
  33.    System.out.println("" );
  34.    System.out.println(id_user+" quitte la session "+uid_log);
  35.    out.println("<a href=\"Index\">Revenir à l'identification</a>" );
  36.   }
  37.   //Sinon, c que tout est ok !
  38.   else {is_session_valide=true;}
  39.  //et à la fin, on renvoie le résultat : mais je sais pas où, ni comment on appelle ci-dessus !!
  40.  return is_session_valide;
  41.  }
  42.  //isValide();  
  43.  catch(java.lang.NullPointerException e)
  44.  {
  45.  // out.println("Aucune Cookie détécté : Votre navigateur doit accepter les cookies" );
  46.  }
  47. }
  48.     
  49. }


 
Et le problème c'est que cela ne marche pas...
Etant donné que je ne peux pas invoquer pageExterne.service();
et que je ne sais pas faire de isValide() qui demanderait l'éxécution de service, et que je ne peux pas me passer de service car c'est lui qui me permet d'utiliser les servlets (session, cookies....)
 
 
Donc, pr clore ce long problème (je préfère le détailer, cela vous permet de comprendre mieux mon problème :)) :
 
* Est-ce que ma méthode est bonne ?
* Dans ce cas, que pouvez vous me proposer pour la page externe ??
 
Infiniment merci !
Victor, pauvre stagiaire, avec le couteau sous la gorge  :(


Message édité par dcvlm le 15-02-2005 à 15:31:26

---------------
ZZZZzzzzz
Reply

Marsh Posté le 15-02-2005 à 09:14:15   

Reply

Marsh Posté le 15-02-2005 à 13:26:16    

Bien j'ai lu un petit peu ton post, mais je crois que t'es en train de refaire ce que tomcat fait déjà, c'est à dire gérer les sessions. Tomcat gere tout seul les sessions (soit par cookies, soit par passage d'un parametre dans l'url) ce qui revient un peu à ce que tu fais. Pour chaque client qui se connecte, tomcat genere un id que tu peux sauvergarder du coté du serveur. S'il n'est pas enregistré sur le serveur, c'est que c'est un nouveau client qui demande à s'indentifier, sinon c'est qu'il l'est déjà. Ce qui reviens à ce que tu disais :

Citation :

je le compare avec ce qu'a le serveur en mémoire, et si ce n'est pas égal => dehors.


 
Pour mieux comprendre mes propos tu peux lire ce post :
http://forum.hardware.fr/forum2.ph [...] subcat=390
 

Reply

Marsh Posté le 15-02-2005 à 15:30:40    

Bien en fait, je m'y prends p-e mal, mais je ne cherche pas à refaire le boulot de tomcat !! Je cherche à m'en servir.
 
Pour moi l'idée de base est dc la suivante : on attribue un id session au client, et à chaque nouvelle page, le serveur compare l'id client dont il dipose et ce que fourni le client (par cookie ou passage de paramètre).
 
J'ai lu le lien que tu proposes, mais c'est un peu trop compliqué pour moi ! Et j'aimerais bien faire "simple"... j'ai l'impression de toucher le problème du doigt !
 
Plutot que de longues phrases, c'est le code qui vous expliquera le mieux ce que je veux faire.
 
Depuis la page que l'on veut consulter : les 3 lignes qui récupérent le travail du "gros code".
 
Pour simplifier : je n'arrive pas à appeller cette fonction/méthode/classe/page (depuis la page désirée) et faire en sorte qu'elle me retourne le résultat..
 
 
Help ! :) :(


---------------
ZZZZzzzzz
Reply

Marsh Posté le 15-02-2005 à 17:22:12    

Si tu veux pas refaire le boulot de tomcat, sert toi uniquement de session et pas de cookies
 
En gros ca pourrait ressembler :
-Tu récupere l'id session du client dans la servlet : req.getSession().getId ()
-Tu vérifie qu'il est pas déjà stocké sur le serveur (dans un arrayList, une map, un vecteur ce que tu veux)
- S'il y est pas, tu vas sur ta page d'identification ou une fois le client identifié, t'ajoutera l'id session du client sur le serveur
- S'il y est le client est dejà identifié
 
Si tu veux faire d'autre vérification, tu peux ajouter des objets dans la session du client. Je rappelle que une session est attribuée à un client donné pour une durée limitée (qui peut etre configurée dans le web.xml je crois).
Passer par un cookie c'est un peu refaire une session en supposant en plus que le client accepte les cookies...
 
PS: petite question au passage, si on stocke les id sessions sur le serveur, comment sait on quand on peut les retirer ?

Reply

Marsh Posté le 15-02-2005 à 18:04:43    

patachou a écrit :

Si tu veux pas refaire le boulot de tomcat, sert toi uniquement de session et pas de cookies
 
En gros ca pourrait ressembler :
1-Tu récupere l'id session du client dans la servlet : req.getSession().getId ()
2-Tu vérifie qu'il est pas déjà stocké sur le serveur (dans un arrayList, une map, un vecteur ce que tu veux)
3- S'il y est pas, tu vas sur ta page d'identification ou une fois le client identifié, t'ajoutera l'id session du client sur le serveur
4- S'il y est le client est dejà identifié
 
Si tu veux faire d'autre vérification, tu peux ajouter des objets dans la session du client. Je rappelle que une session est attribuée à un client donné pour une durée limitée (qui peut etre configurée dans le web.xml je crois).
Passer par un cookie c'est un peu refaire une session en supposant en plus que le client accepte les cookies...
 
PS: petite question au passage, si on stocke les id sessions sur le serveur, comment sait on quand on peut les retirer ?


 
 
Bah c parfait ton idée... mais là où je bloque sacrément, c que pr moi (je me suis permis de numéroter tes points) en faisant 1 j'obtenais 2 !!!!
Donc il faudrait que tu me précises comment faire 2 !!!
 
halte stop !!!!  :pt1cable:  
Je viens de relire et je viens de voir une différence que je pige pas :
c'est quoi la différence entre  

Code :
  1. HttpSession session = req.getSession();


et

Code :
  1. req.getSession().getId ()

??
Betement, je dirai qu'il y en a un qui intialise et un qui récupère... Mais le prb c que je fonctionnais avec la première solution HttpSession session = req.getSession(), mais que lorsque la session n'était pas expirée j'avais bien le meme id session !!!  :??:  :pt1cable:  
 
Et sinon, pr decider du tps max d'inactivité, je fais

Code :
  1. session.setMaxInactiveInterval(30);


 
 
Merci de ton aide....


---------------
ZZZZzzzzz
Reply

Marsh Posté le 15-02-2005 à 18:10:24    

En fait c'est simple, quand il se log tu fais un request.getSession().
Ensuite sur chaque page tu fais un truc du genre

Code :
  1. if(null == request.getSession(false))
  2. //ton utilisateur n'est pas valide
  3. else
  4. //il est valide...


Là tu te casses la tête pour rien jcrois :)
Donc plutôt que de faire un else, tu rediriges sur l'accueil dans le if.
Si l'utilisateur est bon, le reste de ta page s'éxécutera.


Message édité par glod 2 le 15-02-2005 à 18:11:33
Reply

Marsh Posté le 15-02-2005 à 18:10:37    

(ou alors j'ai pas tout lu et j'aurai du :D)

Reply

Marsh Posté le 15-02-2005 à 20:12:38    

Dans mon cas :
en 1, tu obtiens l'id session du client, mais tu sais pas s'il est connecté ou pas, il faut donc le vérifier...
en 2, tu as à disposition une liste (par exemple un arrayList) d'id session qui sont connecté. Tu verifie donc que l'id session en 1 est contenu dans cette liste (contain () ou un truc comme ca pour savoir). S'il est dedans, c'est que le client est déjà identifié.. Sinon faut l'identifier et ajouter son id dans la liste.
 
Voilà c'était ma solution, mais je regarderais à ta place celle de Glod2 qui semble faire encore plus simplement ce que tu veux...

Reply

Marsh Posté le 15-02-2005 à 22:12:01    

Oula, c'est vachement compliqué pour pas grand chose tout ça...
 
D'abord, il faut faire attention avec le request.getSession(false) : certaines JSP peuvent créer automatiquement une session, même si l'utilisateur n'est pas authentifié.  
Pour résoudre le problème (et aussi parce qu'une session peut être utile aussi pour un utilisateur anonyme) : une session peut servir à stocker des objets qui seront conserver entre 2 requêtes (c'est d'ailleurs tout l'intêrets des session). Quand le mot de passe de l'utilisateur a été vérifié, il suffit d'ajouter un attribut quelconque. Ça donne par exemple (la valeur n'a pas d'importance) :  

Code :
  1. request.getSession(true).setAttribute("utilisateur.valide", Boolean.TRUE);


 
Pour tester si l'utilisateur est authentifié :  

Code :
  1. if (request.getSession(true).getAttribute("utilisateur.valide" ) != null)
  2. // utilisateur valide
  3. else
  4. // on n'entre pas!


 
Deuxième chose, au lieu de copier-coller le même code dans toutes les pages, c'est mieux (et plus simple) d'utiliser un filtre.  
En gros, un filtre est un objet (qui implemente l'interface Filter) qui sera appelé avant les servlets/jsp. Il reçoit la requête et la réponse, et peut en faire absolument ce qu'il veut.
 
Dans ton cas, le code de la méthode doFilter ressemblerait à ça :  

Code :
  1. public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
  2.   if (((HttpServletRequest)request).getSession(true).getAttribute("utilisateur.valide" )!=null) {
  3.     chain.doFilter(request, response);
  4. } else {
  5.     ((HttpServletResponse)response).sendRedirect("/login.jsp" );
  6. }
  7. }


 
Le filtre doit être déclaré dans web.xml (ça se déclare comme une servlet, mais en utilisant <filter>, <filter-name>, <filter-class> et <filter-mapping> au lieu de respectivement <servlet>, <servlet-name>, <servlet-class> et <servlet-mapping> )
 
Autre solution : laisser le serveur géré tout ça lui-même, en utilisant <login-config> et <security-constraint> in web.xml (mais c'est un peu le bordel à mettre en place)

Reply

Marsh Posté le 16-02-2005 à 08:25:22    

patachou a écrit :

Dans mon cas :
en 1, tu obtiens l'id session du client, mais tu sais pas s'il est connecté ou pas, il faut donc le vérifier...
en 2, tu as à disposition une liste (par exemple un arrayList) d'id session qui sont connecté. Tu verifie donc que l'id session en 1 est contenu dans cette liste (contain () ou un truc comme ca pour savoir). S'il est dedans, c'est que le client est déjà identifié.. Sinon faut l'identifier et ajouter son id dans la liste.
 
Voilà c'était ma solution, mais je regarderais à ta place celle de Glod2 qui semble faire encore plus simplement ce que tu veux...


 
Bien, oui, ce que propose Glod2 est plus simple, en revanche, ca ne marche pas tellement (il est fort possible que ce soit moi qui n'arrive pas à l'implanter...  :( ) puisque quelque soit le delai d'inactivité, la session reste toujours valide.. :??:  


---------------
ZZZZzzzzz
Reply

Marsh Posté le 16-02-2005 à 08:25:22   

Reply

Marsh Posté le 16-02-2005 à 08:31:53    

Bon, apres avoir répondu à patachou, je m'attaque la proposition de Bufff ...
 
1/
Ca me plait beaucoup dans le concept, en revanche, j'ai tjs raisonné avec un id (getId()), et là je me demande où part cette notion, qui pour moi était incontournable.... :pt1cable:   Je ne remets pas en cause :jap: , ce serait juste pour mieux comprendre... car je suis zéztomaqué  :pt1cable: !
 
 
2/
Egalement, si quelqu'un pouvait développer l'idée que présentait patachou :

Citation :

en 1, tu obtiens l'id session du client, mais tu sais pas s'il est connecté ou pas, il faut donc le vérifier...
en 2, tu as à disposition une liste (par exemple un arrayList) d'id session qui sont connecté. Tu verifie donc que l'id session en 1 est contenu dans cette liste (contain () ou un truc comme ca pour savoir). S'il est dedans, c'est que le client est déjà identifié.. Sinon faut l'identifier et ajouter son id dans la liste.


C'est très flou en effet pour moi...
 
3/
Web.xml, je connais pas trop... J'ai lu un jour qu'il suffisait de le copier/coller tel quel là où on voulait, et hop... Et comme ca marche, bien, je ne me suis pas posé de question... :heink:  
 
 
 
Merci..


Message édité par dcvlm le 16-02-2005 à 08:33:37

---------------
ZZZZzzzzz
Reply

Marsh Posté le 16-02-2005 à 08:49:26    

1/
La session est un objet gardé sur le serveur, associé à un client particulier (en utilisant en général un cookie, mais ça, c'est au serveur de géré, pas au développeur d'application). On peut y stocker ce que l'on veut dedans (méthodes setAttribute et getAttribute).  
Ma proposition, c'est de mettre un attribut dans la session au moment où tu vérifies l'utilisateur. Cet attribut restera là pour les requêtes suivantes, ce qui permet de vérifier l'utilisateur simplement en regardant si l'attribut de session est présent.
2/
ça me semble très compliqué pour rien. Sauf cas très particuliers, en tant que dévelopeur d'application, tu n'as pas à t'occuper des IDs de session, c'est le boulot du serveur.
3/
web.xml, c'est le descripteur d'application. En (très) résumé, c'est le fichier de configuration principal de ton application web. Dedans, on y trouve (entre autres) : declaration des servlets et des filtres, declaration des pages d'erreur, réferences à d'autres objets J2EE (EJB, par exemple), déclarations d'éléments de sécurité, configuration des sessions (timeout, par exemple)
Effectivement, un web.xml tout près peu très bien fonctionner si tu n'utilises que des JSP, mais c'est indispensable de travailler dessus dès que tu fais des trucs un peu plus compliqués (utilisation de servlets ou de filtres, par exemple)
 
Voilà, j'espère que j'ai été clair

Reply

Marsh Posté le 16-02-2005 à 09:41:14    

1/
Tout compris  :sol: Victor très fort :pt1cable: ( :sarcastic: )
2/
C'est marrant, dire que je me basais la dessus....  
3/
Bien en fait, j'ai aucune page en JSP, je n'ai que des servlets.....C'est un peu en contradiction avec ce que tu dis  :??:  :??:  
 
Bonus/
Bon, j'ai testé ce que tu m'as dis... Ca marche très bien ;) Victor content  :)  
En revanche, j'ai pas utilisé "tes" filtres... parce que je trouvais cela plus compliqué que d'utiliser les betes lignes suivantes (bah ouais, je trouve ca moins long en plus !  :??: )  

Code :
  1. if (!(req.getSession(true).getAttribute("utilisateur.valide" ) != null)) 
  2.     out.println("DTC" );
  3.     else


Tes filtres sont-ils nécessaires ?? (sécurité, "propreté" ).....
 
 
Mârci beaucoup en tout cas pr cette solution simple pr un grand débutant java/servlet comme moi  :jap:


Message édité par dcvlm le 16-02-2005 à 09:43:56

---------------
ZZZZzzzzz
Reply

Marsh Posté le 16-02-2005 à 09:49:41    

Et au passage, peux tu m'expliquer ce que je trouve etre une super bizarrerie....
Quand je mets ce que tu proposes ca va tres bien:

Code :
  1. req.getSession(true).setAttribute("utilisateur.valide", Boolean.TRUE);


 
mais, qd je veux mettre (je suis curieux.... :) )

Code :
  1. req.getSession(true).setAttribute("utilisateur.valide", Boolean.true)

(true en minuscule)
 
ou bien meme

Code :
  1. req.getSession(true).setAttribute("utilisateur.valide", true)

(true tout court)
 
--> Le compilateur râle..... Je suis aller voir la doc java et il parrait qu'il faut mettre en objet en deuxième paramètre... Mais je fais pas lien (je ne sais pas vraiement ce qu'est un Objet... pour moi c'est un objet "bete"... enfin, c'est pas tres clair, mais je ne vois pas la différence entre un Object et un objet...  ;) )


Message édité par dcvlm le 16-02-2005 à 10:01:04

---------------
ZZZZzzzzz
Reply

Marsh Posté le 16-02-2005 à 09:56:40    

Boolean.true n'existe pas (tu dois obtenir une erreur de syntax), parce que true est un mot réservé de Java, et ne peut donc pas être utilisé comme nom pour une variable.  
true est une valeur de type boolean, qui est un type primitif et pas un objet. On ne peut mettre que des objets dans la session.
 
Pour l'histoire des filtres : non, ce n'est pas nécessaire, mais c'est plus propre (ça évite de dupliquer du code).  
Et une fois que tu as compris comment marchent les filtres, c'est vraiment super utile pour plein de choses (par exemple, si toutes tes pages utilisent une connexion à une base de donnée, tu peux mettre l'ouverture et la fermeture de la connexion dans un filtre)

Reply

Marsh Posté le 16-02-2005 à 10:07:36    

Citation :

true est une valeur de type boolean, qui est un type primitif et pas un objet. On ne peut mettre que des objets dans la session.

Et boolean.TRUE est un objet alors ?? C'est quoi cette conversion tordue ???
 
A ce propos, si je veux stocker le nom du user dans un attribut de session, et que je fais

Code :
  1. //Lors de l'identification
  2. req.getSession(true).setAttribute("id_user", id_user)
  3. //puis lorsque je veux récupérer
  4. String id_user=req.getSession(true).getAttribute("id_user" );


Et bien le compilateur me dit :  incompatible types
Donc j'imagine qu'il faut faire une conversion, mais j'ai l'impression qu'il y a 36000 facon de faire !!
(String).id_user
Parse_je_sais_plus_quoi(id_user)
id_user.toString()
etc....
 
 
 

Citation :

Pour l'histoire des filtres : non, ce n'est pas nécessaire, mais c'est plus propre (ça évite de dupliquer du code).

 
Je ne vois pas où il y aurait duplication... Mes qqs lignes, je les place au début de chaque page, mais ton filtre aussi  :??: ?? Non ?
 
 

Citation :

Et une fois que tu as compris comment marchent les filtres, c'est vraiment super utile pour plein de choses (par exemple, si toutes tes pages utilisent une connexion à une base de donnée, tu peux mettre l'ouverture et la fermeture de la connexion dans un filtre)


j'ai pas mal de connexion à une base, mais ce n'est pas systématique..
Je procède comme ca :

Code :
  1. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver" );
  2.    String url = "jdbc:odbc:bdvlm";
  3.    Connection con;
  4.    Statement stmt;
  5.    con = DriverManager.getConnection(url, "" , "" );
  6.    stmt = con.createStatement();


1/ C'est bien ? (je demande...on ne sait jamais)
2/ Et donc, je suppose que c'est cela que tu placerais dans le filtre...
Mais le reste de ma page, je le mets où ???  
Cette question doit d'ailleurs rejoindre ce que tu me réponderas pour l'histoire de duplication de code..
 
 :hello:


---------------
ZZZZzzzzz
Reply

Marsh Posté le 16-02-2005 à 13:01:27    

Citation :

Et boolean.TRUE est un objet alors ?? C'est quoi cette conversion tordue ???


Oui, un objet de la classe Boolean. Pour toutes ces question de types primitifs vs objets, ou conversion de type, je te conseille de regarder dans à peu près n'importe quel tutorial Java, c'est en général bien expliqué.  
Sinon, réponse courte : pour récupérer une String de la session, c'est :

Code :
  1. String maVariable = (String)request.getSession().getAttribute("monAttribut" );


 

Citation :

Je ne vois pas où il y aurait duplication... Mes qqs lignes, je les place au début de chaque page, mais ton filtre aussi  :??: ?? Non ?


 
Tu dois placer quelques lignes au début de chaque page, et tu vois pas où il y a duplication de code? :sarcastic:
 
Pour le filtre, non, il n'y a rien à ajouter aux pages.  
Pour bien comprendre comment ça marche, il faut savoir comment le serveur traite une requête. Pour chaque requête, il va construire une liste de filtres (éventuellement vide), et mettre la servlet au bout (cette liste, c'est le troisième paramètre de la méthode doFilter, le FilterChain).  
Le premier filtre va être appelé, et, dans sa méthode doFilter, il y aura en général une instruction "chain.doFilter(request, response);", qui va appeler l'élément suivant de la liste (filtre suivant ou servlet si on est arrivé au bout).
Avec un seul filtre, on aura donc quelque chose du genre

  • le client fait une requête
  • doFilter du filtre est appelée
  • le filtre fait ce qu'il a faire
  • le filtre appelle chain.doFilter
  • la méthode doGet (ou doPost, ...) de la servlet est appelée
  • après l'exécution de la servlet, on revient dans le filtre, qui peut encore faire ce qu'il veut (du nettoyage, par exemple)


Donc le filtre s'exécute "autour" de la serlvet. C'est pour ça que c'est particulièrement utile pour éviter de dupliquer du code qui aurait du être au début de chaque page.  
Autre avantage : le filtre est mappé sur un motif d'url (comme les servlets), donc si tu mets ton filtre sur "/protected/*", tout ce qui est dans "protected" sera automatiquement protégé (pas de risque d'oublier une page, et ça marche aussi sur les pages statiques).
 
Maintenant, pour communiquer entre le filtre et la servlet, il suffit de placer des attributs dans la requête (HttpServletRequest.get/setAttribute)

Citation :


j'ai pas mal de connexion à une base, mais ce n'est pas systématique..
Je procède comme ca :

Code :
  1. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver" );
  2.    String url = "jdbc:odbc:bdvlm";
  3.    Connection con;
  4.    Statement stmt;
  5.    con = DriverManager.getConnection(url, "" , "" );
  6.    stmt = con.createStatement();


1/ C'est bien ? (je demande...on ne sait jamais)
2/ Et donc, je suppose que c'est cela que tu placerais dans le filtre...
Mais le reste de ma page, je le mets où ???  
Cette question doit d'ailleurs rejoindre ce que tu me réponderas pour l'histoire de duplication de code..


1/ Ça illustre très bien mon propos sur l'utilité des filtres... Suppose que tu copies-colles ce code dans toutes les pages qui ont besoin d'utiliser la base de données. Tu fais quoi si un jour, l'url de connexion change? Il faut modifier toutes tes pages...  
2/ j'espère que mon explication du dessus répond à ta question

Reply

Marsh Posté le 16-02-2005 à 14:52:42    

MegaTop.... j'ai tout compris....
 
Donc, ca y'est, je me lance dans ton filter...
En revanche, ca coince quand je lance tomcat....
 
1/ Voici mon fichier web.xml

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <!DOCTYPE web-app
  3.     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
  4.     "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
  5. <web-app>
  6.      <servlet>
  7.         <servlet-name>invoker</servlet-name>
  8.         <servlet-class>
  9.           org.apache.catalina.servlets.InvokerServlet
  10.         </servlet-class>
  11.         <init-param>
  12.             <param-name>debug</param-name>
  13.             <param-value>0</param-value>
  14.         </init-param>
  15.         <load-on-startup>2</load-on-startup>
  16.     </servlet>
  17.    <servlet-mapping>
  18.         <servlet-name>invoker</servlet-name>
  19.         <url-pattern>/*</url-pattern>
  20.     </servlet-mapping>
  21.      
  22.      
  23.     <filter>
  24.      <filter-name>FiltreSession</filter-name>
  25.      <filter-class>Session</filter-class>
  26.     </filter>  
  27.      
  28.     <filter-mapping>
  29.      <filter-name>FiltreSession</filter-name>
  30.      <url-pattern>/*</url-pattern>
  31.     </filter-mapping>
  32.     <session-config>
  33.         <session-timeout>30</session-timeout>
  34.     </session-config>
  35.     <welcome-file-list>
  36.         <welcome-file>index.htm</welcome-file>
  37.     </welcome-file-list>
  38. </web-app>


 
Je t'invite à faire du tri... car comme je le disais j'ai copié/collé ce web.xml depuis le debut, sans trop savoir comment il fonctionnait..
 
2/Voici ma classe de filtre que j'ai appellé Authentification  

Code :
  1. import java.io.*;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import java.lang.*;
  5. import java.util.*;
  6. public class Authentification extends HttpServlet {
  7. public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain)
  8. throws ServletException, IOException {
  9.  if (((HttpServletRequest)request).getSession(false).getAttribute("utilisateur.valide" )!=null)
  10.  {
  11.   chain.doFilter(request, response);
  12.  }
  13.  else
  14.  {
  15.   ((HttpServletResponse)response).sendRedirect("Index" );
  16.      }
  17.    
  18. }
  19. }


 
3/Et voici ce que me dit Tomcat au lancement

16 fÚvr. 2005 14:45:46 org.apache.catalina.core.StandardHostDeployer install
INFO: Installation d'une application pour le chemin de contexte /vlm7 depuis l'U
RL file:D:\tomcat\jakarta-tomcat-5.0.25\webapps\vlm7
16 fÚvr. 2005 14:45:46 org.apache.catalina.core.StandardContext start
GRAVE: Error filterStart
16 fÚvr. 2005 14:45:46 org.apache.catalina.core.StandardContext start
GRAVE: Erreur de dÚmarrage du contexte suite aux erreurs prÚcÚdentes
16 fÚvr. 2005 14:45:46 org.apache.catalina.core.StandardHostDeployer install
INFO: Installation d'une application pour le chemin de contexte /webdav depuis l
'URL file:D:\tomcat\jakarta-tomcat-5.0.25\webapps\webdav
16 fÚvr. 2005 14:45:46 org.apache.coyote.http11.Http11Protocol start
INFO: DÚmarrage de Coyote HTTP/1.1 sur http-8080
16 fÚvr. 2005 14:45:47 org.apache.jk.common.ChannelSocket init
INFO: JK2: ajp13 listening on /0.0.0.0:8009
16 fÚvr. 2005 14:45:47 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=16/47  config=D:\tomcat\jakarta-tomcat-5.0.25\conf\jk
2.properties
16 fÚvr. 2005 14:45:47 org.apache.catalina.startup.Catalina start
INFO: Server startup in 10359 ms


 
 
Astuce : mon rep c'est vlm7....mais ca doit pas etre une grosse surprise  :)
 
 
Merci de ton aide !


---------------
ZZZZzzzzz
Reply

Marsh Posté le 16-02-2005 à 15:11:15    

Ton filtre, il doit implémenter javax.servlet.Filter, et pas étendre HttpServlet (il te faudra aussi implémenter init et destroy).
 
Sinon, il y a un problème avec ton web.xml : si tu mets le filtre sur /*, comment est-ce que tu fais pour afficher la page de login? Je te conseille de plutôt mapper le filtre sur un sous-répertoire (et au passage, vire la servlet "invoker", et mappe directement tes servlets à toi)

Reply

Marsh Posté le 16-02-2005 à 15:35:11    

Bufff a écrit :

Ton filtre, il doit implémenter javax.servlet.Filter, et pas étendre HttpServlet (il te faudra aussi implémenter init et destroy).
 
Sinon, il y a un problème avec ton web.xml : si tu mets le filtre sur /*, comment est-ce que tu fais pour afficher la page de login? Je te conseille de plutôt mapper le filtre sur un sous-répertoire (et au passage, vire la servlet "invoker", et mappe directement tes servlets à toi)


 
Comme je le disais, j'ai jamais vraiment parmétrer un fichier web.xml, et j'esssaie plein de trucs (avec ou sans les / avec ou sans /servlet...)
bref, je suis perdu...
 
J'ai donc fais cela :

<web-app>
     <servlet>
        <servlet-name>vlm7</servlet-name>
        <servlet-class>Index</servlet-class>
 
    </servlet>
 
   <servlet-mapping>
        <servlet-name>vlm7</servlet-name>
        <url-pattern>/vlm7/serlvet</url-pattern>
    </servlet-mapping>
       
    <filter>
     <filter-name>Authentification</filter-name>
     <filter-class>Authentification</filter-class>
    </filter>  
     
    <filter-mapping>
     <filter-name>Authentification</filter-name>
     <url-pattern>protected/*</url-pattern>
    </filter-mapping>
 
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
 
    <welcome-file-list>
        <welcome-file>index.htm</welcome-file>
    </welcome-file-list>
 
</web-app>


Et ca ne marche absolument pas...
L'arboresence est la suivate :
webapps/vlm7/protected pour les trucs qui doivent etres protégés
webapps/vlm7/ pour le reste  
 
Donc, c'est quoi qui ne vas pas dans mon web.xml ??
Merci  :jap:


---------------
ZZZZzzzzz
Reply

Marsh Posté le 16-02-2005 à 16:08:58    

Essaie déjà de mettre : /protected/* dans <url-pattern>
Sinon, tu dis que ça marche pas, mais c'est quoi qui ne marche pas?

Reply

Marsh Posté le 16-02-2005 à 16:15:45    

Bufff a écrit :

Essaie déjà de mettre : /protected/* dans <url-pattern>
Sinon, tu dis que ça marche pas, mais c'est quoi qui ne marche pas?


Après modification faite, tomcat me dit :
 

INFO: Installation d'une application pour le chemin de contexte /vlm7 depuis l'URL file: D:\tomcat\jakarta-tomcat-5.0.25\webapps\vlm7
 
16 févr. 2005 16:14:12 org.apache.catalina.core.StandardContext start
GRAVE: Error filterStart
 
16 févr. 2005 16:14:12 org.apache.catalina.core.StandardContext start
GRAVE: Erreur de démarrage du contexte suite aux erreurs précédentes


 
 
Et attend : la meilleur pr la fin : j'ai donc enlevé complétement la partie filtre, et ca ne démarre tjs pas !!!
Donc, avec l'aborscence que j'ai donné, comment faut-il parametrer le début ???? Ca doit etre tout con, mais je m'y perds avec les /servelt les vlm7/servlet ou les servlet/vlm7....
Parce que les tuto sont bien gentils, mais comme ils ne donnent pas l'arbo, je n'arrive pas à "calquer" chez moi...
 
merci !


Message édité par dcvlm le 16-02-2005 à 16:27:09

---------------
ZZZZzzzzz
Reply

Marsh Posté le 16-02-2005 à 17:02:36    


<!DOCTYPE web-app
     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
     "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">


Ça, c'est le DOCTYPE pour la norme servlet 2.2. Les filtres sont apparus en 2.3. Essaie de mettre ça à la place (j'imagine que tu utilises un Tomcat >= 4.0, donc


<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">


 
Ensuite, l'ordre des éléments peut avoir de l'importance. L'ordre est : filter, filter-mapping, servlet, servlet-mapping, session-config, welcome-file-list

Reply

Marsh Posté le 17-02-2005 à 09:55:34    

J'ai corrigé mais rien n'y fait....
 
Je commence à déprmier sévèrement  :(  
En enlevant tout ce qui parle de filtre, je n'arrive pas à configurer mon web.xml
 
Avant j'utilisais ca :

    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
 
   <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>


 
Mais il parait que "c'est pas bien"....
Donc je voulais revenir à un truc propre "home made"...
 
Mais c'est la catastrophe.... Ca doit pourtant pas etre dur, mais j'ai l'impression d'avoir essayé toutes les possiblités, en vain !!  :cry:
 
 
Gadgets:
Mon arbo :
http://webenic.enic.fr/~vlemanchec/hfr/arbo.gif
 
Les classes qui ne doivent pas etre protégées :
http://webenic.enic.fr/~vlemanchec/hfr/classes_non_protegees.gif
 
Les classes qui doivent etres protégées (y'a pas tout...):
http://webenic.enic.fr/~vlemanchec/hfr/classes_protegees.gif


Message édité par dcvlm le 17-02-2005 à 11:16:09

---------------
ZZZZzzzzz
Reply

Marsh Posté le 17-02-2005 à 14:43:01    

New !!!
Bon, en galérant depuis ce matin, j'ai reussi à faire marcher convenablement les classes non protégées...
 
En revanche, je n'arrive pas à acceder aux classes protégées !!
 
En effet, avec :

<servlet>
        <servlet-name>LectureTable</servlet-name>
       <servlet-class>protected.LectureTable</servlet-class>
   </servlet>
 <servlet-mapping>
        <servlet-name>LectureTable</servlet-name>
        <url-pattern>/LectureTable</url-pattern>
    </servlet-mapping>
 


 
J'obtiens :

type Rapport d'exception
 
message
 
description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.
 
exception
 
javax.servlet.ServletException: Erreur d'allocation à une instance de servlet
 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793)
 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702)
 org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571)
 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644)
 java.lang.Thread.run(Thread.java:534)
 
cause mère
 
[b]java.lang.NoClassDefFoundError: protected/LectureTable (wrong name: LectureTable)[/b]
 java.lang.ClassLoader.defineClass0(Native Method)
 java.lang.ClassLoader.defineClass(ClassLoader.java:537)
 java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
 org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1634)
 org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:860)
 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1307)
 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1189)
 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:793)
 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:702)
 org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:571)
 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:644)
 java.lang.Thread.run(Thread.java:534)


 
 
 
Voilà.... et je ne vois pas comment paramétrer mon <servlet-class> pour que ca marche....
 
merci !


Message édité par dcvlm le 17-02-2005 à 15:10:46

---------------
ZZZZzzzzz
Reply

Marsh Posté le 17-02-2005 à 14:50:43    

ben ton package il s'appelle protected pas protect...
 

Citation :

<servlet>
        <servlet-name>LectureTable</servlet-name>
       <servlet-class>protected.LectureTable</servlet-class>
</servlet>


Message édité par glod 2 le 17-02-2005 à 14:51:04
Reply

Marsh Posté le 17-02-2005 à 15:08:56    

Glod 2 a écrit :

ben ton package il s'appelle protected pas protect...
 

Citation :

<servlet>
        <servlet-name>LectureTable</servlet-name>
       <servlet-class>protected.LectureTable</servlet-class>
</servlet>



 
Arff  :whistle:  
y'a effectivement un prb, mais pas celui que tu crois : sur mon screen shoot ca s'appelle bien "protected", et ds le code que j'ai collé "protect", mais à ce moment là, le rép s'appellait bien "protect"...
 
ET CA NE MARCHE PAS....
 
Donc pour repartir sur de bonnes bases :
*le dossier s'appelle protected
*dans le web.xml aussi (je vais de ce pas éditer mon message précédent)
 
 
Autres indices pour m'aider :
1/je ne sais pas ce qu'est un package
 
2/je ne sais pas du tout si dans le web.xml ca change qqchose de faire
2a/

protected/LectureTable


2b/

/protected/LectureTable


2c/

protected.LectureTable


 
3/Dans ma classe LectureTable, je n'ai pas mis de truc genre

package XYZ

(juste avant les imports), comme je le vois parfois à force de chercher à droite à gauche...


---------------
ZZZZzzzzz
Reply

Marsh Posté le 17-02-2005 à 16:38:58    

Le nom du package doit être le même que l'arborescence ou se trouve la classe.
Dans ton cas :
package protected;
pour les classes qui sont dans le répertoire protected.

Reply

Marsh Posté le 18-02-2005 à 09:17:54    

Glod 2 a écrit :

Le nom du package doit être le même que l'arborescence ou se trouve la classe.
Dans ton cas :
package protected;
pour les classes qui sont dans le répertoire protected.


 
J'ai donc rajouté package protected; en haut de ma classe LectureTable...
Mais ca ne marche tjs pas  :(  

java.lang.NoClassDefFoundError: protect/LectureTable (wrong name: LectureTable)


 
Et ceci avec les déclarations suivantes :

<servlet>
   <servlet-name>LectureTable</servlet-name>
   <servlet-class>protect.LectureTable</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LectureTable</servlet-name>
    <url-pattern>/protect/LectureTable</url-pattern>
</servlet-mapping>


 
Et en tappant:

http://localhost:8080/vlm7/protect/LectureTable


 
 
remarque : j'ai tout mis protect et non protected parce que protected est un mot réservé...


Message édité par dcvlm le 18-02-2005 à 09:18:57

---------------
ZZZZzzzzz
Reply

Marsh Posté le 18-02-2005 à 11:38:13    

Et tu as aussi renommé ton dossier en protect ?

Reply

Marsh Posté le 18-02-2005 à 12:05:41    

Glod 2 a écrit :

Et tu as aussi renommé ton dossier en protect ?


Oui bien sur !!!  :cry:  :cry:


---------------
ZZZZzzzzz
Reply

Marsh Posté le 07-03-2005 à 14:18:16    

Bonjour bonjour....
 
Je me permets un petit up, parce que j'avais baissé les bras, mais j'ai vraiment besoin de faire marcher cette histoire... :cry:  :cry:  
 
Pr ceux qui ont le courage de lire : c'est parfait, vous aller comprendre mon problème parfaitement.
 
Sinon, je fais un premier résumé de mon problème :
je n'arrive pas à acceder à des servlets dans un sous répetoire !

Ex : webapps\monapp\WEB-INF\classes\Toto.class

-> j'arrive tres bein à y acceder en configurant le xml de la manière suivante :  

    <servlet>
        <servlet-name>Toto</servlet-name>
       <servlet-class>Toto</servlet-class>
   </servlet>
    <servlet-mapping>
        <servlet-name>Toto</servlet-name>
        <url-pattern>/Index</url-pattern>
    </servlet-mapping>


et en demandant : http://localhost:8080/monapp/Toto
 
et revanche, ex2 : webapps\monapp\WEB-INF\classes\protect\Titi.class
et en déclarant  
 

     <servlet>
        <servlet-name>Titi</servlet-name>
       <servlet-class>protect.Titi</servlet-class>
   </servlet>
 
   <servlet-mapping>
        <servlet-name>Titi</servlet-name>
        <url-pattern>/Titi</url-pattern>
    </servlet-mapping>


 
et en demandant http://localhost:8080/monapp/Titi  
--> ca ne marche pas !!!
(et j'ai mis en haut de ma class Titi :

package protect

tout en sachant pas tellement si c'est utile, et si oui, à quoi ca sert  :( )
 
Merci de votre aide  :sweat:


Message édité par dcvlm le 07-03-2005 à 14:19:33

---------------
ZZZZzzzzz
Reply

Marsh Posté le 07-03-2005 à 15:46:33    

Ben écoute, pour une servlet dont le package est :

Code :
  1. package com.badtrick.servlet;


L'entrée suivante du web.xml

Code :
  1. <servlet>
  2.     <servlet-name>Transfert</servlet-name>
  3. <servlet-class>com.badtrick.servlet.Transfert</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6.     <servlet-name>Inscription</servlet-name>
  7.     <url-pattern>/Inscription</url-pattern>
  8. </servlet-mapping>


 
et où les classes sont dans :

Code :
  1. \WEB-INF\classes\com\badtrick\servlet


fonctionne, t'as vraiment dû oublier un truc...


Message édité par glod 2 le 07-03-2005 à 15:46:55
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed