Bonjour à tous,
dans le cadre d'un projet en reseau, je suis chargé de développer un wiki en servlet sous tomcat. Toute la partie wiki fonctionne, seul l'authentification me pose problème.
J'ai choisit de séparer l'authentification du reste. Voici le code de mon LoginHandler.java
La ressource a laquelle on doit accéder si on est loggé:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 import java.io.*; //import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class LoginHandler extends HttpServlet { private static final long serialVersionUID = 1L; protected String userbase = "database"; protected String userbase_save = "database.back"; public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); // Get the user's account number, password String account = req.getParameter("login"); String password = req.getParameter("pass"); String account_new = req.getParameter("login_new"); String password_new = req.getParameter("pass_new"); if ((account == null) && (password == null) && (subscribe(account_new, password_new, userbase))) { out.println("<head><title>Compte cree</title></head>"); out.println("<body>Vous etes maintenant enregistre sous " + account_new + ".<br>"); out.println("Bon surf ;-)"); out.println("</body></html>"); } // Check the name and password for validity if (!allowUser(account, password, userbase)) { out.println("<head><title>Acces refusé</title></head>"); out.println("<body>Votre login et/ou votre mot de passe sont invalides.<br>"); out.println("Vous voulez peut-etre <a href=\"login.html\">reessayer.</a>"); out.println("</body></html>"); } // Valid login. Make a note in the session object. HttpSession session = req.getSession(); session.setAttribute("logon.isDone", account); // just a marker object // Try redirecting the client to the page he first tried to access try { String target = (String) session.getAttribute("login.target"); if (target != null) { res.sendRedirect(target); return; } } catch (Exception ignored) { } // Couldn't redirect to the target. Redirect to the site's home page. //res.sendRedirect(req.getRequestURL().toString()); doGet (req, res); //getServletContext().getRequestDispatcher("/ProtectedResource").forward(req, res); } protected boolean subscribe (String account, String password, String file) { try { FileWriter fw = new FileWriter (file + ".txt", true); String foo = account + ":" + password; fw.write(foo); return true; } catch (IOException e) { return allowUser (account, password, userbase_save); } } protected boolean allowUser(String account, String password, String file) { try { BufferedReader buffer = new BufferedReader (new FileReader (file + ".txt")); String line; String foo = account + ":" + password; while ((line = buffer.readLine ()) != null) if (line.equals(foo)) { buffer.close(); return true; } buffer.close(); return false; } //penser a mettre return loadFile(W_database) a la place de false en dessous // | catch (FileNotFoundException e) { return allowUser (account, password, userbase_save); } catch (IOException e) { return allowUser (account, password, userbase_save); } } }
mon web.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 import java.io.*; //import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class ProtectedResource extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); // Get the session HttpSession session = req.getSession(); // Does the session indicate this user already logged in? Object done = session.getAttribute("logon.isDone"); // marker object if (done == null) { // No logon.isDone means she hasn't logged in. // Save the request URL as the true target and redirect to the login page. session.setAttribute("login.target", req.getRequestURL().toString()); res.sendRedirect(req.getContextPath() + "/login.html"); return; } // If we get here, the user has logged in and can see the goods out.println("Bienvenue " + done + ". Vous etes a present loggue !"); } }
et enfin ma page d'acceuil login.html
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>Securite</servlet-name> <servlet-class>LoginHandler</servlet-class> <servlet-class>ProtectedResource</servlet-class> </servlet> <servlet-mapping> <servlet-name>Securite</servlet-name> <url-pattern>/Securite</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/login.html</welcome-file> </welcome-file-list> <!-- <error-page> --> <!-- <error-code>404</error-code> --> <!-- <location>/error.html</location> --> <!-- </error-page> --> <!-- <error-page> --> <!-- <error-code>java.lang.NullPointerException</error-code> --> <!-- <location>/error.html</location> --> <!-- </error-page> --> </web-app>
Le problème est lors du clic sur le bouton "envoyer", y me dit que que la ressource loginhandler n'est pas dispo:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 <html> <head> <title>Login</title> </head> <body> <div align=center><h1>Login Page</h1></div> <br/><br/> <form action="LoginHandler" method="post"> <table width="75%"> <h3><i>Deja inscrit?</i></h3> <tr> <td width="48%">Login</td> <td width="52%"> <input type="text" name="login" /> </td> </tr> <tr> <td width="48%">Mot de passe</td> <td width="52%"> <input type="password" name="pass" /> </td> </tr> </table> <br/> <br/> <table width="75%"> <h3><i>Pas encore inscrit?</i></h3> <tr> <td width="48%">Login</td> <td width="52%"> <input type="text" name="login_new" /> </td> </tr> <tr> <td width="48%">Mot de passe</td> <td width="52%"> <input type="password" name="pass_new" /> </td> </tr> </table> <p> <input type="submit" name="Submit" value="Envoyer" /> <input type="reset" name="Reset" value="Reinitialisation" /> </p> </form> </body> </html>
via l'url http://localhost:8080/Securite/LoginHandler
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Etat HTTP 404 - /Securite/Securite/LoginHandler type Rapport d'état message /Securite/Securite/LoginHandler description La ressource demandée (/Securite/Securite/LoginHandler) n'est pas disponible.
Je pense que ça doit etre un problème dans le web.xml ou login.html mais je vois pas et je tourne en rond depuis pas mal de temps
Par ailleurs un autre problème apparait, comment faire l'appel a doGet de protectedresource.java a partir de loginhandler ? car si j'ai bien compris, ca doit suivre ce type schéma:
login.html --> loginhandler --> authentifié/newuser --> protectedresource
login.html --> loginhandler --> non authentifié --> message d'erreur
c'est bien ça ?
Merci d'avance pour vos réponses
Partager