2011-11-02 13 views
6

puedo crear este filtro:¿Cómo se filtra una web en JSF 2?

public class LoginFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest req = (HttpServletRequest) request; 
     HttpSession session = req.getSession(); 

     if (session.getAttribute("authenticated") != null || req.getRequestURI().endsWith("login.xhtml")) { 
      chain.doFilter(request, response); 
     } else { 
      HttpServletResponse res = (HttpServletResponse) response; 
      res.sendRedirect("login.xhtml"); 
      return; 
     } 

    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 

    } 

    @Override 
    public void destroy() { 
    } 
} 

Ésta es mi estructura:

enter image description here

Y luego agregar el filtro en el web.xml:

<filter> 
    <filter-name>LoginFilter</filter-name> 
    <filter-class>filter.LoginFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>LoginFilter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
</filter-mapping> 

funciona el filtro como debería pero me sigue dando este error:

"Was not possible find or provider the resource, login" 

Y después de eso mi richfaces ya no funciona.

¿Cómo puedo resolver eso? ¿O crear un filtro web correctamente?

+0

Ese es un mensaje de error extraño. ¿Lo tradujo de otro idioma? ¿Es solo un error HTTP 404? – BalusC

+0

Yo hago BalusC, soy de Brasil, entonces el error aparece en portugués, ¿sabes cómo puedo cambiar el Eclipse al inglés? Entonces podría publicar el error original. –

+2

El idioma predeterminado de Eclipse depende de la configuración regional predeterminada de la plataforma. Entonces, si su sistema operativo está configurado en portugués, Eclipse heredará esta configuración. Pero puede anular esto especificando el argumento '-nl [languagecode]' en 'eclipse.exe'. Por ejemplo: 'eclipse.exe -nl en' lo configurará en inglés. – BalusC

Respuesta

9

Cualquier URL relativa a la ruta (es decir, las URL que no comienzan con /) que pase a sendRedirect() será relativa al URI de solicitud actual. Entiendo que la página de inicio de sesión está en http://localhost:8080/contextname/login.xhtml. Por lo tanto, si, por ejemplo, tiene acceso a http://localhost:8080/contextname/pages/user/some.xhtml, esta llamada de redireccionamiento realmente apuntará al http://localhost:8080/contextname/pages/user/login.xhtml, que creo que no existe. Mire la URL en la barra de direcciones de su navegador una vez más.

Para solucionar este problema, más bien redirija a una URL relativa al dominio en su lugar, es decir, comience la URL con /.

res.sendRedirect(req.getContextPath() + "/login.xhtml"); 
+0

gracias compañero =] –

+0

De nada. – BalusC

Cuestiones relacionadas