salut
je veut savoir s'il existe une maniere pour exclure mon login page de session-timeout.
en effet ,mon session-timeout =30 et si mon login page depasse cette durée,j'obtient une erreur 500
salut
je veut savoir s'il existe une maniere pour exclure mon login page de session-timeout.
en effet ,mon session-timeout =30 et si mon login page depasse cette durée,j'obtient une erreur 500
ouii tu peux envoyer périodiquement (29min et 58s),une requête ajax, dans la page de login, à l'aide de a4j:poll par exemple.
Articles: Richfaces - JBosstools pour JSF.
Ca devrait marcher (bon, personnellement, je mettrais cet intervalle un peu plus faible, genre 28m, on ne sait jamais).
Nous sommes tous semblables, alors acceptons nos différences !
--------------------------------------------------------------
Liens : Blog | Page DVP | Twitter
Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
Critiques : Apache Maven
j'ai testé et ça à l'air de marcher sauf pour un cas particulier:
si par example une autre page(non login page) reste inactif pendant la periode de session-timeout, cette page sera rediriger vers mon login page et si j'entre mon login et password j'aurai le meme probleme:authentification non faite à cause de l'erreur:
qu'est ce que je doit faire?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 javax.faces.application.ViewExpiredException: viewId:/pages/userLogin.jsf - View /pages/userLogin.jsf could not be restored.
a partir du moment ou tu a redirigé vers la page de login suite à un timeout, tu devrais avoir une session toute neuve! Comment tu fait cette redirection vers le login?
j'ai utilisé un filtre et en voici le code:
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 public class TimeoutFilter implements Filter { private static final String LOGIN_PAGE = "pages/userLogin.jsf"; public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) { HttpServletRequest hRequest = (HttpServletRequest) request; HttpServletResponse hResponse = (HttpServletResponse) response; System.out.println("etatchek=="+checkResource(hRequest)); if (checkResource(hRequest)) { System.out.println("erreur appelation"); if(hRequest.getSession().getAttribute("User")==null) { String timeoutUrl = hRequest.getContextPath() + "/" + LOGIN_PAGE; hResponse.sendRedirect(timeoutUrl); } else if (checkSession(hRequest)) { String timeoutUrl = hRequest.getContextPath() + "/" + LOGIN_PAGE; hResponse.sendRedirect(timeoutUrl); return; } } } filterChain.doFilter(request, response); } private boolean checkResource(HttpServletRequest request) { String requestPath = request.getRequestURI(); HttpServletRequest hRequest = (HttpServletRequest) request; return !(requestPath.contains(LOGIN_PAGE) || requestPath.equals(hRequest.getContextPath() + "/")); } private boolean checkSession(HttpServletRequest request) { return request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid(); } public void destroy() { } }
remplace
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part sendRedirect(timeoutUrl)
ca permettra d'envoyer au login le nouveau numéro de session.
Code : Sélectionner tout - Visualiser dans une fenêtre à part sendRedirect(response.encodeURL(timeoutUrl))
et en utilisant;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 String pageURI = "..." ; FacesContext facesContext = .. ; ExternalContext externalContext = facesContext.getExternalContext(); try { externalContext .redirect(pageURI); } catch (IOException e) { // TODO Auto-generated catch block }
Articles: Richfaces - JBosstools pour JSF.
j'ai ajouté ce code:
j'ai obtenu alors un nullpointerexception causé par la ligne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 FacesContext facesContext = FacesContext.getCurrentInstance(); ; ExternalContext externalContext = facesContext.getExternalContext(); try { externalContext .redirect(LOGIN_PAGE); } catch (IOException e) { e.printStackTrace(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part ExternalContext externalContext = facesContext.getExternalContext();
initialise le FacesContext, le code c'est à titre explicatif pas pour le copier/coller.
Articles: Richfaces - JBosstools pour JSF.
va faire exactement la meme chose que ton code, donc ca sert à rien. De plus "initialiser" le FacesContext est loin d'être une mince affaire. Donc évite. Essaie, avant le redirect et en faisant bien un encoreURL, de faire un session.invalidate(); Fait bien le invalidate *avant* le encodeURL!
Code : Sélectionner tout - Visualiser dans une fenêtre à part externalContext .redirect(LOGIN_PAGE);
j'ai ajouté invalidate session comme suit:
mais toujours même resultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 hRequest.getSession().invalidate(); hResponse.sendRedirect(hResponse.encodeURL(timeoutUrl));
Code : Sélectionner tout - Visualiser dans une fenêtre à part javax.faces.application.ViewExpiredException: viewId:/pages/userLogin.jsf - View /pages/userLogin.jsf could not be restored.
Ok, je viens de tilter :s
Si ma mémoire est bonne, dans le redirect, les règles HTTP disent que le borwser doit resoumettre ses donnée (POST/GET) à la nouvelle adresse -> ton navigateur soumet un nouvelle demande pour login.jsf (suivant le redirect) en faisant un POST avec un viewId qui ne correspond plus à rien puisque session out.
Il serait probablement plus simple de remplacer ton redirect par ceci
surcharge de HttpServletRequestWrapper
surcharge des méthode getParameterXXX pour qu'elles renvoient "du vide"
appel au requestDispatcher.forward pour faire effectuer le rendu par login.jsf
De cette manière
- plus de paramètre (get/post) disponble --> jsf va faire un createView
- par de redirect nécessaire
Exacte!!
mais il est obligé d'avoir le facecontext pour sauvegarder le viewRoot afin qu'il soit disponible dans le GET de la redirection.
Je pense que c'est peut être mieux d'utiliser le PhaseListener.
Le filtre est utilisé seulement pour détecter le session timeout? si ouii y'a d'autre solutions adéquates.
Articles: Richfaces - JBosstools pour JSF.
Pour le PhaseLisneter voici des exemples d'utilisation: un et deux.
Sinon pour l'expiration de session, si tu utilises Richfaces, y'a une fonction javascript A4J.ajax.onExpired lancé à l'expiration de session, tu peux l'utiliser pour faire une redirection: voici un exemple
Enfin,il existe un listner pour la session HttpSessionLisneter et voilà un exemple.
Articles: Richfaces - JBosstools pour JSF.
Partager