使用p:commandbutton成功登录JSF后重定向到主页面

时间:2013-05-20 17:21:33

标签: ajax jsf redirect primefaces

我有以下代码:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui"> 

    <h:head>
        <link href="res/css/login.css" rel="stylesheet" type="text/css" />
        <title>Iniciar Sesión</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>
        <script src="res/js/login.js" type="text/javascript"></script>        

    </h:head>
    <h:body>
        <div class="errorMsg">
                        <!-- Change this text based on the error message -->
                        <span>Ooops! Los datos de usuario ó contraseña son incorrectos! Inténtelo de nuevo.</span>
                        <a href="#" title="Close error message">&#10006;</a>
                </div>
                <div class="wrapper">
                    <h:form id="formLogin">
                        <div class="loginBox">
                            <h2>Iniciar Sesión al panel de la diputación</h2>
                                <fieldset class="dataCapture">
                                    <h:inputText id="usuario" value="#{loginBean.nombre}"></h:inputText><!--value="71946976D"--> 
                                    <h:inputSecret id="contrasena" value="#{loginBean.contrasena}"></h:inputSecret><!-- value="1234"-->
                                </fieldset>

                                <fieldset class="submission">
                                        <input type="checkbox" name="rememberMe" id="rememberMe" />
                                        <label for="rememberMe">Recordar contraseña</label>
                                        <p:commandButton id="login" value="Iniciar Sesión" action="#{loginBean.logear()}" oncomplete="checkLogin(xhr, status, args)"/>                                       
                                </fieldset>
                        </div>
                        <div class="forgotPassword">
                                ¿Olvidaste tu contraseña? <a href="#" title="Click here to reset it.">Haz click para restablecerla.</a>
                        </div>
                    </h:form>
                </div>

    </h:body>
</html>

login.js中的以下javascript函数:

 function checkLogin(xhr,status,args){
    if(args.usuariorol === -1){
        $('.errorMsg').fadeIn(500).delay(5000).fadeOut(500);
    }
    else{
        alert('correcto!');            
        document.getElementById("formLogin").action = "main.jsp";
        document.getElementById("formLogin").onsubmit = "return true";
    }
}

管理登录会话的managedbean:

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */

    package app.bean;

    import javax.ejb.EJB;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.RequestScoped;

    import app.dao.UsuarioFacade;
    import app.entity.Usuario;
    import com.google.gson.Gson;
    import com.google.gson.JsonElement;
    import com.google.gson.JsonObject;
    import java.io.Serializable;
    import javax.annotation.PostConstruct;
    import org.primefaces.context.RequestContext;

    /**
     *
     * @author Tone
     */
    @ManagedBean
    @RequestScoped
    public class LoginBean implements Serializable {

        @EJB
        private UsuarioFacade userFacade;

        private String nombre;
        private String contrasena;

        public String getNombre() {
            return nombre;
        }

        public String getContrasena() {
            return contrasena;
        }

        public void setNombre(String nombre) {
            this.nombre = nombre;
        }

        public void setContrasena(String contrasena) {
            this.contrasena = contrasena;
        }


        public void logear(){

            Usuario u = userFacade.getUsuarioContrasena(nombre, contrasena);

            JsonElement jsonElem;
            JsonObject json = new JsonObject();
            Gson gson = new Gson();

            if(u==null){
                jsonElem = gson.toJsonTree(-1);
            }
            else{
                jsonElem = gson.toJsonTree(u.getCodigoRol().getCodigo().toString());
            }
            json.add("usuariorol", jsonElem);
            RequestContext reqCtx = RequestContext.getCurrentInstance();
            reqCtx.addCallbackParam("usuariorol", jsonElem.getAsInt());
        }
    }

正如您所看到的,我设置了一个RequestContext,用于添加回调参数,在checkLogin中使用后,这是p:commandbutton中“oncomplete”事件中调用的函数,我处理此数据并设置一个启动元素隐藏着jQuery通知登录错误,好吧,我想要做的是在登录成功重定向到主页但p:commandbutton不能这样做的情况下,我已经明白这个标签只处理请愿和请求通过ajax,我真的需要这个用于结果数据的jQuery事件,如何重定向到另一个页面?

问候!

1 个答案:

答案 0 :(得分:2)

最简单的方法是在服务器端登录方法中重定向请求 - here's如何操作。

如果您想要在客户端重定向,那么您可以在不完整的方法中使用window.location=wherever

然而,一个提示 - 如果您真的想要确保您的网站安全,请考虑使用像Spring security一样强大的框架。