1

ログインが失敗すると、フィルターは私をにリダイレクトします/users/indexLogueados.xhtml。これは正しくありません。フィルタは私をにリダイレクトする必要があり/faces/index.xhtmlます。

なぜこれが起こるのですか?

フィルタは次のとおりです。

@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() {        
    }

}

これは、マネージドBean名を持つマネージドBeanのlogin()メソッドです。Autenticaraut

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;
}

そして、これはログインフォームです:

<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>
4

1 に答える 1

1

chain.doFilter(request, response);毎回(リダイレクトを送信した後でも)実行する必要がありますが、部分的にのみ実行されifます。外に移動して、評価条件を変更してください。

@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);
}

より詳しい情報:

Filterインターフェースで最も重要なメソッドは、フィルターの心臓部であるdoFilterメソッドです。

于 2012-11-29T01:38:29.183 に答える