Intento crear formulario de inicio de sesión en la aplicación web.
en la página JSP puedo usar

<%
   String name = request.getParameter( "username" );
   session.setAttribute( "theName", name );
%>

pero ahora estoy usando JSF /Facelets para la aplicación web
No sé cómo crear sesión en JSF Backing bean para el cliente y comprobar si el usuario está logueado o no, se le redirigirá a la página de inicio de sesión.
quien me puede ayudar a darme el enlace del tutorial para estos problemas ?
gracias antes de

Ahora tengo un pequeño problema con la asignación en web.xml
código cortada de Filtro de clase

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    this.config = filterConfig;
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    LoginController controller = (LoginController) req.getSession()
            .getAttribute("loginController");
    if (controller == null || !controller.isLoggedIn()) {
        res.sendRedirect("../admin/login.xhtml");
    } else {
        chain.doFilter(request, response);
    }
}

y en web.xml yo mapa con <fitler> etiqueta

<filter>
    <filter-name>userLoginFilter</filter-name>
    <filter-class>com.mcgraw.controller.UserLoginFilter</filter-class>
    <init-param>
        <param-name>loginPage</param-name>
        <param-value>/login.xhtml</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>userLoginFilter</filter-name>
    <url-pattern>/admin/*</url-pattern>
</filter-mapping>

Tengo una carpeta de admin en la web del proyecto y comprobar si el usuario no ha iniciado la sesión con admin permiso para no acceder a la página (que puedo hacer la comprobación de permisos) pero cuando uso el filtro del navegador no entiende url ??
no StackTrace mostrar cuando el navegador no entiende url

Error que se muestra en Firefox

The page isn't redirecting properly

sobre es decir que la carga de … de carga . .. sin parar

ahora puedo cambiar la condición de que se verifique si req.getPathInfo.startsWith(«/login.xhtml») se hará de la cadena de

Tengo 2 idea, pero es la respuesta de ESTADO HTTP 500

 if (controller == null || !controller.isLoggedIn()) {
     res.sendRedirect("../admin/login.xhtml");
     if(req.getPathInfo().startsWith("/login.xhtml")){
     chain.doFilter(request, response);
}

} else {
     chain.doFilter(request, response);
}

===============

if (controller == null || !controller.isLoggedIn()) {
    if (!req.getPathInfo().startsWith("/login.xhtml")) {
        res.sendRedirect("../admin/login.xhtml");
    } else {
        chain.doFilter(request, response);
    }
} else {
    chain.doFilter(request, response);
}

======================
actualización de la Clase loginController

package com.mcgraw.controller;
import com.DAO.UserBean;
import com.entity.IUser;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
/**
* @author Kency
*/
@ManagedBean
@SessionScoped
public class LoginController implements Serializable {
@EJB
private UserBean userBean;
private IUser user;
private boolean admin;
private boolean mod;
private PasswordService md5;
/** Creates a new instance of LoginController */
public LoginController() {
user = new IUser();
md5 = new PasswordService();
}
//getter /setter
public boolean isMod() {
return mod;
}
public void setMod(boolean mod) {
this.mod = mod;
}
public IUser getUser() {
return user;
}
public void setUser(IUser user) {
this.user = user;
}
public boolean isAdmin() {
return admin;
}
public void setAdmin(boolean admin) {
this.admin = admin;
}
public String cplogin() {
String md5Password = md5.md5Password(user.getPassword());
if (userBean.userLogin(user.getUsername(), md5Password) != null) {
if (user.getUsername() != null || md5Password != null) {
user = userBean.userLogin(user.getUsername(), md5Password);
if (user.getGroups().getAdmin() != null) {
setAdmin(user.getGroups().getAdmin());
}
if (user.getGroups().getMods() != null) {
setMod(user.getGroups().getMods());
}
if (isAdmin() == true || isMod() == true) {
return "home";
} else {
return "login";
}
} else {
return "login";
}
} else {
return "login";
}
}
public String logout() {
user = null;
return "login";
}
public boolean isLoggedIn() {
return user != null;
}
}

Tengo un nuevo problema si render JSF taglib con el método loggedIn, en el índice de la página (no en la carpeta admin) de inicio de sesión de usuario no puede ver lo que me hacen a ejemplo de, <== esto es como si un usuario no usuario de inicio de sesión no puede ver, pero ¿por qué se ve?

InformationsquelleAutor Kency | 2010-10-01

2 Comentarios

  1. 48

    Puede en JSF get/set HTTP atributos de sesión a través de ExternalContext#getSessionMap() que es básicamente un contenedor de HttpSession#get/setAttribute().

    @Named
    @RequestScoped
    public class LoginController {
    private String username;
    private String password;
    @EJB
    private UserService userService;
    public String login() {
    User user = userService.find(username, password);
    FacesContext context = FacesContext.getCurrentInstance();
    if (user == null) {
    context.addMessage(null, new FacesMessage("Unknown login, try again"));
    username = null;
    password = null;
    return null;
    } else {
    context.getExternalContext().getSessionMap().put("user", user);
    return "userhome?faces-redirect=true";
    }
    }
    public String logout() {
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "index?faces-redirect=true";
    }
    //...
    }

    En el Facelets página, solo tienes que enlazar el username y password los campos de entrada para este bean y la invocación de login() acción en consecuencia.

    <h:form>
    <h:inputText value="#{loginController.username}" />
    <h:inputSecret value="#{loginController.password}" />
    <h:commandButton value="login" action="#{loginController.login}" />
    </h:form>

    Atributos de sesión son accesibles directamente en EL. Una sesión de atributo con nombre user es en EL disponible como #{user}. Cuando se prueba si el usuario se registra en algunos rendered atributo, acaba de comprobar si es empty o no.

    <h:panelGroup rendered="#{not empty user}">
    <p>Welcome, #{user.fullName}</p>
    <h:form>
    <h:commandButton value="logout" action="#{loginController.logout}" />
    </h:form>
    </h:panelGroup>

    La desconexión de acción, básicamente, sólo destroza la sesión.


    Como a la comprobación de una solicitud entrante si un usuario está logueado o no, basta con crear un Filtro que hace aproximadamente lo siguiente en doFilter() método:

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession(false);
    String loginURI = request.getContextPath() + "/login.xhtml";
    boolean loggedIn = session != null && session.getAttribute("user") != null;
    boolean loginRequest = request.getRequestURI().equals(loginURI);
    boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER);
    if (loggedIn || loginRequest || resourceRequest) {
    chain.doFilter(request, response);
    } else {
    response.sendRedirect(loginURI);
    }
    }

    Mapa en un url-pattern cubriendo las páginas restringidas, por ejemplo,/secured/*, /app/*, etc.

    Véase también:

    • hola BalusC todo bien pero tengo un pequeño problema con el mapa a web.xml la página se puede ver por encima pregunta que me editar, tengo la carpeta de admin en el proyecto web y redirigir a ../admin/login.xhtml es que no funcione el navegador no lo entiendo
    • Si la página de inicio de sesión se coloca en /admin, entonces el mismo filtro se invoca de nuevo y va a ir en un infinito bucle de redireccionamiento porque el usuario no está conectado. Cualquier lugar de la página de inicio de sesión fuera de la /admin o agregar una condición que se comprueba si req.getPathInfo().startsWith("/login.xhtml") y, a continuación, sólo seguir la cadena y no la redirección.
    • una vez más he editado mi pregunta con la solución que sugieren pero puedo recuperar el error 500 de Estado HTTP en el servidor glassfish se lanza la Excepción de Puntero Nulo
    • OK, pathinfo es aparentemente null en el filtro. Uso req.getRequestURI().endsWith("/login.xhtml") lugar.
    • gracias por su apoyo ! pero cuando se redirigir a la de inicio de sesión.xhtml es cierto pero quiero chang extensión de inicio de sesión.jsf
    • Solo cambie en consecuencia en la URL en el filtro.
    • oh, me falta asignada <url-pattern>*.jsf</url-pattern> y editar en la clase de filtro, una vez más, muchas gracias
    • Hola Balusc tengo un nuevo Problema con él, userlogin arriba, yo uso para admincp pero cuando accedo a la página principal( de admincp carpeta) ejemplo de contenido/registro.xhtml es redirigir me localhost/contenido/admin/login.jsf. ¿cómo puedo evitar la redirección de la página de admincp carpeta, yo estaba en mapa web.xml url-partern es <url-partern>/admin/*</url-partern> Gracias!
    • Redirigir a /content/login.jsf o ../login.jsf lugar.
    • Hola Balusc lo hago pero me repita la carga de inicio de sesión.jsf localhost/miproyecto/admin/login.jsf, en firefox puedo conseguir mensaje The page isn't redirecting properly , la verdadera url de redirección en el filtro de res.sendRedirect("../admin/login.jsf");
    • y tengo un problema con cierre de sesión, cuando yo cierre de sesión de usuario es nulo y el re-inicio de sesión se lanza la Excepción de destino null usuario.nombre de usuario. ¿por error? Gracias
    • El primer error es causado porque estás redirigiendo a la página de inicio de sesión en un bucle infinito. Usted tiene que mover a la página de inicio de sesión fuera de la url-pattern del archivador o revise el interior del filtro si la página solicitada no es la página de inicio de sesión. En cuanto a la desconexión, sólo tiene que añadir un if (user != null) de verificación antes de acceder el usuario.
    • Gracias , me voy a mover de inicio de sesión en otra carpeta de la carpeta admin y otra página dentro de la carpeta de contenido. funciona bien Gracias
    • ¿Dónde puedo agregar if(user !=null) ? método de inicio de sesión o cierre de sesión de método? yo intente con logout y login pero no funciona
    • Justo allí donde NullPointerException fue causada porque user es null.
    • Hola BalusC puedo obtener excepción WARNING: /admin/login.xhtml @43,73 value="#{loginController.user.username}": Target Unreachable, 'null' returned null no sé dónde puedo agregar usuario != null, yo estaba actualizado pregunta con el código. Buenas Noches BalusC Gracias!
    • Eso no es un NullPointerException. El #{loginController.user} acaba de regresar null y, por tanto, es imposible establecer #{loginController.user.username}. Usted necesita asegurarse de que #{loginController.user} nunca devuelve null. Generalmente, te gustaría preinitialize anidada frijoles durante la declaración de soja o de construcción o postconstruct como user = new User(). Y.. en el futuro, por favor, hacer una nueva pregunta para cada problema independiente 🙂
    • Gracias ! pero yo estaba preinitialize en constructor y al usuario final de la llamada método de inicio de sesión, el usuario establece en null en este método el usuario=null y el usuario es global varialbe al usuario cerrar la sesión se establece en null por lo tanto loginController.el usuario es nulo,lo sé, pero no sé cómo volver iniciales para el usuario = new Usuario(); Después de este problema voy a publicar cada pregunta para independiente problema 🙂 Gracias
    • Te gustaría enfocar este problema de una forma un poco diferente. En lugar de depender de la presencia de la User para comprobar si alguien está conectado o no, por ejemplo, utilizar la if (user.getId() != null). Al salir, acaba de hacer user = new User() para preparar los campos de inicio de sesión.
    • UserService no puede ser resuelto a un tipo – ¿qué importación/jar falta? thanx
    • era sólo ejemplar. Escribir por ti mismo. Se trata de una simple @Stateless EJB que hace a la persistencia de las obras (por ejemplo, JPA o tal vez el viejo y simple JDBC).
    • gracias tio! … …
    • Cómo ‘seguro’ es esto?

  2. 2

    Intente esto en su backing bean cuando se recibe una solicitud (como en un método de acción):

    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    HttpSession session = request.getSession();

    Entonces usted puede trabajar con la solicitud y los objetos de sesión al igual que usted utiliza para con Jsp, los atributos de configuración y así sucesivamente.

    También puede ser que desee echar un vistazo a mi relacionados con la pregunta acerca de la comprobación de la sesión del cliente en un servlet Filtro. Podría escribir una similar Filtro de verificación para el usuario de inicio de sesión en su HttpSession y, a continuación, hacer una redirección (o RequestDispatch como terminé haciendo) a su página de inicio de sesión si es necesario.

    • HttpSession de disponer de un método setAttribute() de la misma sesión jSP pero, ¿cómo puedo mantener y comprobar sesión en el cliente ?
    • No estoy entendiendo de qué era lo que estaban haciendo antes. Puedes editar tu pregunta y proporcionar algunas de sus viejas código? Cuando usted dice «check sesión en el cliente», ¿realmente significan que usted está revisando algo en el lado del cliente con JavaScript?
    • yo era encontrar phaselistenter a la verificación de inicio de sesión de usuario para JSF. Mi pregunta es, cuando el usuario de la página web de acceso a través de navegador web jsf se echa de usuario de inicio de sesión o no se que significa en jsp escribo 1 página período de sesiones.getAttribute(«nombre») y lo incluya en el encabezado de la página donde quiero verificación de inicio de sesión de usuario o no de inicio de sesión. Pero el uso de phaselistener comprobarán pero ahora yo aún no entiendo phaselistener trabajo. tienes tutorial de enlace para JSF inicio de la sesión,si alguna? si usted tiene darme el enlace a un tutorial gracias

Dejar respuesta

Please enter your comment!
Please enter your name here