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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
| /*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package web;
import dao.DaoException;
import domain.Utilisateur;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import service.IService;
import web.util.Authenticate;
import web.views.AdminViews;
/**
*
* @author Gabz
*/
public class Administration extends HttpServlet {
private Authenticate sAuthenticate;
private IService serviceUtilisateur = null;
final private Set<Utilisateur> users = new HashSet<Utilisateur>();
final private AdminViews views = new AdminViews();
final private String loginURL = "/login.do";
final private String logoutURL = "/logout.do";
@Override
final public void init(ServletConfig c) throws ServletException {
serviceUtilisateur = (IService) new XmlBeanFactory(new ClassPathResource("spring-config-postgres.xml")).getBean("serviceUtilisateur");
sAuthenticate = new Authenticate();
}
private class Spy implements HttpSessionBindingListener {
final Utilisateur user;
public Spy(Utilisateur user) {
this.user = user;
}
// traitement d'une nouvelle session
public void valueBound(HttpSessionBindingEvent event) {
users.add(user);
}
// traitement de fin de session
public void valueUnbound(HttpSessionBindingEvent event) {
users.remove(user);
}
}
@Override
final protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// on regarde si l'utilisateur est en session et identifié pour autoriser l'execution de action
// renvoie null si l'utilisateur est autorisé
String view = beforeAll(request);
if (view == null) {
// On effectue ici l'action demandée dans le formulaire
view = processAction(request, response);
}
if (view != null) {
// ne fait rien pour l'instant
view = beforeView(view, request);
}
if (view != null) {
// Affiche la vue
processView(view, request, response);
}
} catch (Throwable t) {
String view = error(request, response, t);
if (view != null) {
try {
processView(view, request, response);
} catch (Throwable e) {
throw new ServletException(e);
}
}
} finally {
afterAll(request);
}
}
public String beforeAll(HttpServletRequest request) {
// Vérifier l'authentification
System.out.println("Before all : " + request.getPathInfo());
// si l'utilisateur demande une page autre que login et s'il n'est pas authentifié dans la session, on le renvoie vers le formulaire pour se connecter
// (modif : renvoyer sur la page d'accueil tout simplement)
if (!request.getPathInfo().equals(loginURL)) {//getServletPath()
Utilisateur user = getUser(request);
if (user.getAuth() == false) {
String msg = "Vous devez vous authentifier " + request.getPathInfo();
return views.loginForm(request, user, msg);
}
}
// sinon c'est qu'il demande à se logger ou faire une action
// on ne renvoie donc pas de vue, elle sera décidée suivant l'action
return null;
}
public Utilisateur getUser(HttpServletRequest request) {
HttpSession session = request.getSession();
synchronized (session) {
Object userEnSession = session.getAttribute("user");
System.out.println(userEnSession);
// si l'utilisateur est déjà venu il possède une session avec l'attribut "user"
if (userEnSession instanceof Utilisateur) {
return (Utilisateur) userEnSession;
}
// sinon, on crée cet attribut "user"
Utilisateur newUser = new Utilisateur();
session.setAttribute("user", newUser);
// espionner la session
//session.setAttribute("spy", new Spy(newUser));
return newUser;
}
}
private String processAction(HttpServletRequest request, HttpServletResponse response) throws Throwable {
request.setCharacterEncoding("UTF-8");
String action = request.getPathInfo();//getServletPath();
if (action.equals(loginURL)) {
System.out.println("Action = login");
return doLogin(request);
}
if (action.equals(logoutURL)) {
System.out.println("Action = logout");
return doLogout(request);
}
// autres actions
throw new ServletException("action " + action + " inconnue.");
}
// Interception avant vue
// Si l'on souhaite exécuter une dernière action avant d'afficher
// (par exemple fin du calcul du temps d'execution de la page)
public String beforeView(String view, HttpServletRequest request) {
return view;
}
// On regarde s'il s'agit d'un .jsp ou autre
// Seulement les .jsp et .jspx sont acceptés
// On envoie la requête/réponse à la vue décidée dans le processAction
private void processView(String view, HttpServletRequest request, HttpServletResponse response) throws Throwable {
if (view.endsWith(".jsp") || view.endsWith(".jspx")) {
// technologie JSP/JSPX
request.getRequestDispatcher(view).forward(request, response);
/*} else if (view.endsWith(".xsl")) {
// technologie XSLT / JAXP
processXsltView(view, request, response);*/
} else {
// autres technologies
throw new IllegalStateException("no view " + view);
}
}
// Interception après vue
public void afterAll(HttpServletRequest request) {
// Rien à faire ici
}
// Interception dune erreur
public String error(HttpServletRequest request, HttpServletResponse response, Throwable e) {
String msg = "erreur interne : " + e.getMessage();
return views.message(request, msg);
}
public String doLogin(HttpServletRequest request) {
Utilisateur user = getUser(request);
// si lutilisateur est connu
System.out.println("Utilisateur : " + user);
if (user.getAuth()) {
return views.home(request, user, users);
}
// sinon récupérer les données du formulaire
user.setEmail(request.getParameter("email"));
user.setPassword(Utilisateur.encode(request.getParameter("password")));
// si aucune données : retour au formulaire
if (user.getEmail() == null || user.getPassword() == null) {
return views.loginForm(request, user, null);
}
// traiter les données
if (user.getPassword().length() == 0) {
return views.loginForm(request, user, "Mot de passe vide");
}
try {
user = sAuthenticate.authentifier(user);
System.out.println("Authentification terminée");
if (user.getAuth()) {
HttpSession session = request.getSession();
session.setAttribute("spy", new Spy(user));
return views.home(request, user, users);
}
return views.loginForm(request, user, "mot de passe incorrect");
} catch (DaoException e) {
}
return views.loginForm(request, user, "Utilisateur inconnu");
}
public String doLogout(HttpServletRequest request) {
Utilisateur user = getUser(request);
user.setAuth(false);
user.setIdUser(null);
user.setNom(null);
user.setPassword(null);
return views.message(request, "A bientôt");
}
} |
Partager