POST/REDIRECT/GET avec STRUTS
Bonjour la communauté! J'utilise Struts 1.3.8 avec Netbeans et FireFox 3.6.9, mais je fais face à un véritable problème.
A l'origine mon problème est de pouvoir sortir (me déconnecter) de mon application en toute sécurité, i.e. faire un logout sécurisé, mais seulement lorsque je me déconnecte de l'application malgré le que je fasse :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public class LogoutAction extends Action{
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception
{
HttpSession session = request.getSession();
if(session != null){
session.removeAttribute("user");
session.invalidate();
}
return mapping.findForward("logout");
}
} |
Dès que je fais un "back" dans mon navigateur, je suis ramené à la page précédente et tout se passe comme si l'utilisateur était toujours connecté.
Pour résoudre mon problème j'ai suivi le tutoriel suivant http://www.javaworld.com/javaworld/j...27-logout.html. J'ai donc ma page logout.jsp qui ressemble à ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
<%@page contentType="text/html"%>
<%
response.setHeader("Cache-Control","no-cache"); //Forces caches to obtain a new copy of the page from the origin server
response.setHeader("Cache-Control","no-store"); //Directs caches not to store the page under any circumstance
response.setDateHeader("Expires", 0); //Causes the proxy cache to see the page as "stale"
response.setHeader("Pragma","no-cache"); //HTTP 1.0 backward compatibility
User user = (User) session.getAttribute("user");
if (null == user) {
request.setAttribute("Error", "Session has ended. Please login.");
RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
rd.forward(request, response);
}
//ContextHolder.setContext(null);
%>
<jsp:forward page="login1.do"/> |
De même dans mon fichier struts-config.xml j'ai:
Code:
1 2
|
<controller nocache="true" processorClass="com.foo.struts.processor.IRequestProcessor"/> |
Où ma classe IRequestProcessor est la suivante:
Code:
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
|
public class IRequestProcessor extends TilesRequestProcessor {
// On verifie si l'utilsateur est bien connecté
protected boolean isUserConnected(HttpServletRequest request, HttpServletResponse response) {
if (request != null) {
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute("user") != null) {
return true;
} else {
return request.isRequestedSessionIdValid();
}
}
return false;
}
// On vérifie si la session a expirée : la session expire si l'id de la session n'est pas valide
@Override
protected boolean processRoles(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping)
throws java.io.IOException, javax.servlet.ServletException {
if (isUserConnected(request, response)) {
return true;
} else {
try {
//If no redirect user to login Page
request.getRequestDispatcher("login.jsp").forward(request, response);
} catch (Exception ex) {
// log.error(ex);
request.getRequestDispatcher("../login.jsp").forward(request, response);
}
}
return false;
}
} |
Mais seulement ici un nouveau problème se pose: lorsque je clic sur le bouton "back" du navigateur (en l'occurrence FireFox) il me demande si je veux renvoyer les informations ou non, lorsque je dis oui, bien évidemment il se reconnecte et je n'ai toujours pas de solution, et si je dis non il ne fait rien même pas le "back" (retour à la page précédente).
Alors si quelqu'un à une idée de comment résoudre le problème de déconnexion d'une application java web avec Struts 1.x, je serais intéressé par sa solution.
Merci d'avance!