1

When the login fails, the filter redirects me to /users/indexLogueados.xhtml. This is not correct. The filter should redirect me to /faces/index.xhtml.

Why does this happen?

Here is the filter:

@WebFilter("/faces/usuarios/*")
public class FiltroUsuarios implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {    
        HttpServletRequest req = (HttpServletRequest) request;
        Autenticar auten = (Autenticar) req.getSession().getAttribute("aut");

        if (auten != null && auten.isLogueado()) {
            // User is logged in, so just continue request.
            chain.doFilter(request, response);
        } else {
            // User is not logged in, so redirect to index.
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect(req.getContextPath() + "/faces/index.xhtml");
        }
    }

    @Override
    public void destroy() {        
    }

}

This is the login() method of the Autenticar managed bean which has the managed bean name aut:

public String login() {
    RequestContext context = RequestContext.getCurrentInstance();
    FacesMessage msg;

    try {
        cl = ClienteService.getInstance().getClienteLogin(nombre);

        if (contrasenia.equals(cl.getClave())) {
            logueado = true;
            ruta = "usuarios/indexLogueados.xhtml";
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Bienvenido ", nombre);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        } else {
            logueado = false;
            ruta = "index.xhtml";
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Error de usuario", "Credenciales erroneas");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    } catch (Exception ex) {
        msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Error de usuario", "Credenciales erroneas");
        ruta = "index.xhtml";
        logueado = false;
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    FacesContext.getCurrentInstance().addMessage(null, msg);
    context.addCallbackParam("logueado", logueado);
    logueado = false;
    return ruta;
}

And this is the login form:

<h:form id="formularioAltas">
    <div class="buttonBarItem">
        <p:commandButton id="basic" value="" style="background:url(css/images/backgroundL1.png) no-repeat; border: none" styleClass="clientes" onclick="dlg2.show();" type="button" />

        <h:panelGrid columns="2" cellpadding="5">  
            <h:outputLabel for="nombre" value="Usuario: " />  
            <p:inputText value="#{aut.nombre}"   
                         id="nombre" required="true" label="Usuario" />  

            <h:outputLabel for="contrasenia" value="Contraseña:" />  
            <h:inputSecret value="#{aut.contrasenia}"   
                           id="contrasenia" required="true" label="Contraseña" />  

            <f:facet name="footer">  
                <p:commandButton id="loginButton" value="Entrar" action="#{aut.login}" type="submit" styleClass="ui-state-default-formu" />
            </f:facet>   
        </h:panelGrid>  
    </div>
</h:form>
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
dalcon
  • 65
  • 6

1 Answers1

1

chain.doFilter(request, response); must be executed everytime (even after sending a redirect), but it's being executed only in the if part. Move it outside and change your evaluation conditions.

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest req = (HttpServletRequest) request;
    Autenticar auten = (Autenticar) req.getSession().getAttribute("aut");

    if (auten == null || !auten.isLogueado()) {
        // User is not logged in, so redirect to index.
        HttpServletResponse res = (HttpServletResponse) response;
        res.sendRedirect(req.getContextPath() + "/faces/index.xhtml");
    }
    //Just continue request.
    chain.doFilter(request, response);
}

More info:

The most important method in the Filter interface is the doFilter method, which is the heart of the filter.

Community
  • 1
  • 1
Luiggi Mendoza
  • 85,076
  • 16
  • 154
  • 332
  • Well and, how do redirection so that the filter acts? – dalcon Nov 29 '12 at 11:44
  • When I redirect .. .... the aut.login return a url and i not use the filter – dalcon Nov 29 '12 at 11:45
  • SOLVED I REDIRECT WITH... HttpServletRequest request; request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); FacesContext.getCurrentInstance().getExternalContext().redirect(request.getContextPath() + ruta); return;.... THANK YOU – dalcon Nov 29 '12 at 13:10
  • @downvoter at least leave a comment. I really hate cowards like you. – Luiggi Mendoza Nov 30 '12 at 04:41
  • how i leave a comment? up, I put Thank you.. Is not that a comment? SORRY, I am new to this forum, I do not know how it works very well. – dalcon Nov 30 '12 at 11:13
  • @dalcon my last comment wasn't for you. Sorry if you felt that way. – Luiggi Mendoza Nov 30 '12 at 13:01