2012-11-28 165 views
1

当登录失败时,过滤器将我重定向到/users/indexLogueados.xhtml。这是不正确的。过滤器应该将我重定向到/faces/index.xhtml过滤器无法正常工作JSF

为什么会发生这种情况?

这里是过滤器:

@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名autAutenticar管理bean的login()方法:

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

你已经调试过了,你确定过滤器中的else {}被调用了吗? – fatfredyy

回答

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界面中的方法是doFi过滤法,这是过滤器的核心。

+0

那么,如何做重定向,使过滤器的行为? – dalcon

+0

当我重定向.. .. .. aut.login返回一个url,我不使用过滤器 – dalcon

+0

解决我重定向... HttpServletRequest请求; request =(HttpServletRequest)FacesContext.getCurrentInstance()。getExternalContext()。getRequest(); FacesContext.getCurrentInstance()。getExternalContext()。redirect(request.getContextPath()+ ruta); return; ....谢谢 – dalcon

相关问题