Bonjour,
me voici devant un problème de gestion de session.
On m'a donné un tuto permettant de mettre en place un système de session avec test de connexion et de TIME OUT.
Voilà ce que j'ai fait :
j'ai d'abord créé une classe FaqRequestProcessor que voici :
J'ai modifié le fichier struts-config.xml pour qu'il prenne en compte cette classe et non le RequestProcessor par défaut.public class FaqRequestProcessor extends RequestProcessor
{
//on vérifie si l'utilisateur est bien connecté
protected boolean isUserConnected(HttpServletRequest request, HttpServletResponse response){
HttpSession httpSession = request.getSession();
//renvoie true si l'utilisateur est authentifé (par l'intermédiaire de l'attribut user) ou s'il accède à la page login
if(request.getServletPath().contains("/login.action"))
{
return true;
}
else
{
if( httpSession != null && httpSession.getAttribute("user") != null)
{
return true;
}
else
{
return false;
}
}
}
//on vérifie si la session a expirée : la session expire si l'id de la session n'est pas valide
protected boolean isSessionValid(HttpServletRequest request) throws ServletException
{
if (request != null)
{
return request.isRequestedSessionIdValid();
}
return false;
}
protected boolean processRoles(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping)
throws IOException, ServletException
{
ActionMessages messages = new ActionMessages();
//vérification de la session
if (isSessionValid(request))
{
//vérification de l'authentification
if (isUserConnected(request, response))
{
return true;
}
else
{
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("erreurs.connection.required"));//ajout du message
request.setAttribute(Globals.ERROR_KEY, messages);
}
}
else
{
messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("erreurs.session.expired"));//ajout du message
request.setAttribute(Globals.ERROR_KEY, messages);
}
//redirection vers une page d'erreur
request.getRequestDispatcher("/WEB-INF/vues/login.jsp").forward(request, response);
return false;
}
}
Je possède donc un formulaire de login, qui correspond à la page d'entrée de l'application web (défini dans le web.xml) :
Ce formulaire permet d'entrer login/mdp, crypte le mdp avec l'algo de cryptage MD5 et appelle ensuite une action que voici :<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Gestion de stocks - Identification</title>
<html:javascript formName="identificationForm" />
<script language="javascript" src="JS/md5.js"></script>
<script language="javascript">
function envoyer()
{
with(document.identificationForm)
{
if(validateIdentificationForm(document.identificationForm))
{
password.value = MD5(password.value);
submit();
}//if
}//with
}//envoyer
</script>
</head>
<body>
<center>
<h2>Ouvrir une session</h2>
<html:form action="/login" styleId="identificationForm">
<table>
<tr>
<td>login : </td>
<td><html:text property="login" /></td>
</tr>
<tr>
<td>password : </td>
<td><html:password property="password" /></td>
</tr>
</table>
<table>
<tr>
<td><input type="button" value="Connexion" onclick="envoyer()" /></td>
<!-- <td><input type="submit" value="Connect" name="submit" /></td> -->
</tr>
</table>
</html:form>
<html:errors />
</center>
</body>
</html>
Cette action vérifie simplement (grâce à hibernate) que l'utilisateur utilise le bon couple login/mdp. Si il à faut, il est renvoyé sur la page de login, avec un jolie message d'erreur classique. Sinon, il est envoyé sur une page d'accueil.public class LoginAction extends ForwardAction
{
public ActionForward execute(ActionMapping arg0, ActionForm arg1, HttpServletRequest arg2, HttpServletResponse arg3) throws Exception
{
//Récupération du formulaire
DynaActionForm formulaire = (DynaActionForm)arg1;
String login = (String)formulaire.get("login");
String password = (String)formulaire.get("password");
ActionMessages am = getErrors(arg2);
//obtention de session hibernate
Session session = HibernateUtil.currentSession();
//debut transaction
session.beginTransaction();
//chargement par hibernate de la liste des employés
List result = session.createQuery("from Employe where nom='" + login + "'").list();
//commit hibernate
session.getTransaction().commit();
//fermeture session
HibernateUtil.closeSession();
//Traitement du résultat
if(result.size() == 0)
am.add("baduser", new ActionMessage("identificationForm.badUser"));
else
{
Employe e = (Employe)result.get(0);
if(!e.getPass().equals(password))
am.add("badpass", new ActionMessage("identificationForm.badPassword"));
}
//Présence d'erreurs ?
if(am.size() != 0)
{
saveErrors(arg2, am);
return arg0.getInputForward();
}
return arg0.findForward("connexion");
}
}
Voici mon problème : sans utilisé le nouveau RequestProcessor, l'application marche parfaitement, mais pas de gestion de session. Dès que j'ajoute le RequestProcessor, j'arrive sur le formulaire d'identification, mais dès que je valide, le RequestProcessor me sort une erreur de conexion "erreurs.connection.required".
La fonction isSessionValid(request) à donc bien envoyée true, mais la seconde fonction isUserConnected(request, response) renvoie false.
ici :if (request != null) retourne true donc l'objet requête est bien initialisé, mais request.isRequestedSessionIdValid(); renvoie false. C'est là que ca cloche.protected boolean isSessionValid(HttpServletRequest request) throws ServletException
{
if (request != null)
{
return request.isRequestedSessionIdValid();
}
return false;
}
Quelqu'un pourrait m'aider ?
Partager