java - JSF 过滤器无法正常工作

标签 java jsf authentication servlet-filters

当登录失败时,过滤器会将我重定向到/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() {        
    }

}

这是 Autenticar 托管 bean 的 login() 方法,该方法具有托管 bean 名称 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;
}

这是登录表单:

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

最佳答案

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

更多信息:

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

关于java - JSF 过滤器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13612322/

相关文章:

javascript - 使用主干的外部私有(private) API 身份验证

java - Spring Data JPA save() 返回实体

java - 在后台运行一段时间后关闭应用程序

c# - Java 或 C# 的线程是基于用户空间线程还是内核空间线程?

jsf - 如何配置 Primefaces p :editor to enforce paragraphs

php - CakePHP 根据用户名在登录时重定向

java - Swagger 不适用于 Spring MVC 应用程序

javascript - 在 JSF 中弹出使用 iText 创建的 PDF

jsf - PrimeFaces 数据表排序不起作用

iphone - OAuth 问题,带参数的 POST