Bonjour à tous !

J'ai un souci avec JSF et visiblement un Filter que j'ai codé.
Le rôle du filter et d'aller récupérer un managed bean stocké en session pour voir si un utilisateur est connecté ou non. S'il l'est pas il est redirigé vers une page de login.

J'utilise également Richfaces et Tomahawk, je ne sais pas si leurs filtres peuvent générer des conflits donc je préfère le préciser.

Voici le filtre que j'ai codé :

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
public class LoginFilter implements Filter{
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        FacesContext fc = getFacesContext(request, response);
        UserController uc = (UserController) fc.getELContext().getELResolver().getValue(fc.getELContext(), null, "user");
 
        if(uc.getLogged().getId() == 0){
            request.getServletContext().getRequestDispatcher("/login.jsf").forward(request, response);
            return;
        }
 
         chain.doFilter(request, response);
    }
 
    private FacesContext getFacesContext(ServletRequest request, ServletResponse response) {
        HttpServletRequest rq = (HttpServletRequest) request;
      // Try to get it first
      FacesContext facesContext = FacesContext.getCurrentInstance();
      if (facesContext != null) return facesContext;
 
      FacesContextFactory contextFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
      LifecycleFactory lifecycleFactory = (LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
      Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
 
      // Either set a private member servletContext = filterConfig.getServletContext();
      // in you filter init() method or set it here like this:
      // ServletContext servletContext = ((HttpServletRequest)request).getSession().getServletContext();
      // Note that the above line would fail if you are using any other protocol than http
 
        // Doesn't set this instance as the current instance of FacesContext.getCurrentInstance
         facesContext = contextFactory.getFacesContext(rq.getSession().getServletContext(), request, response, lifecycle);
 
         // Set using our inner class
        InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);
 
        // set a new viewRoot, otherwise context.getViewRoot returns null
        UIViewRoot view = facesContext.getApplication().getViewHandler().createView(facesContext, "yourOwnID");
        facesContext.setViewRoot(view);
 
        return facesContext;
    }
 
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }
 
 
 
    public void destroy() {
 
    }
 
    private abstract static class InnerFacesContext extends FacesContext
    {
        protected static void setFacesContextAsCurrentInstance(FacesContext facesContext) {
        FacesContext.setCurrentInstance(facesContext);
    }
 
 
}
C'est donc dans le doFilter() que je fais le test. Le reste du code je l'ai repris d'un autre topic sur un autre forum et cela me permet de pouvoir récupérer un FacesContext et donc mon managed bean.

Le souci vient du fait que lorsque je lance mon application j'arrive sur ma page de login mais le css n'est pas pris en compte. Il le devient lorsque je suis connecté.

Ma façon de procéder dans doFilter() pose-t-elle des problèmes ?

Merci d'avance pour vos réponses