Вопрос

I am building a simple login for with username, password and remember me option. Like all web pages i want to save the password and username (or automatically login the visitor). I tried using cookies but when i am trying to load them with:

FacesContext facesContext = FacesContext.getCurrentInstance();
Cookie cookie[] = ((HttpServletRequest) facesContext.getExternalContext().getRequest()).getCookies(); 

I get an empty array. I was debugging my code many times and I still don't have a clue why a get an empty array. I save my cookies every time my remember me is enabled with this code:

((HttpServletResponse) facesContext.getExternalContext().getResponse()).addCookie(user_cookie);
            ((HttpServletResponse) facesContext.getExternalContext().getResponse()).addCookie(password_cookie);
            ((HttpServletResponse) facesContext.getExternalContext().getResponse()).addCookie(remember_cookie); 

Here is the complete code of my bean:

package es.web.login;

import java.util.Map;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Adrian Stefanovski <adrian@elektrosoft.com.mk>
 */
@ManagedBean(name = "visitor", eager = true)
@SessionScoped
public final class Visitor {

    private String city;
    private String username;
    private String password;
    private boolean remember;
    String remember_string = "false";

    public Visitor() {
        checkCookie();
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setRemember(boolean remember) {
        this.remember = remember;
    }

    public boolean getRemember() {
        return remember;
    }

    public String login() {
        if (username.equals("dino") && password.equals("dino")) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            Cookie user_cookie = new Cookie("user_cookie", username);
            Cookie password_cookie = new Cookie("password_cookie", password);
            if (remember == false) {
                remember_string = "false";
            } else {
                remember_string = "true";
            }
            Cookie remember_cookie = new Cookie("remember_cookie", remember_string);
            user_cookie.setMaxAge(3600);
            password_cookie.setMaxAge(3600);
            remember_cookie.setMaxAge(3600);
            if (remember) {
                user_cookie.setMaxAge(3600);
                password_cookie.setMaxAge(3600);
                remember_cookie.setMaxAge(3600);
            } else {
                user_cookie.setMaxAge(0);
                password_cookie.setMaxAge(0);
                remember_cookie.setMaxAge(0);
            }

            ((HttpServletResponse) facesContext.getExternalContext().getResponse()).addCookie(user_cookie);
            ((HttpServletResponse) facesContext.getExternalContext().getResponse()).addCookie(password_cookie);
            ((HttpServletResponse) facesContext.getExternalContext().getResponse()).addCookie(remember_cookie);
            return "logedin";
        } else {
            return "failure";
        }
    }

    public void checkCookie() {
        FacesContext facesContext = FacesContext.getCurrentInstance();

        Cookie cookie[] = ((HttpServletRequest) facesContext.getExternalContext().getRequest()).getCookies();
        Map<String, Object> requestCookieMap = facesContext.getExternalContext().getRequestCookieMap();
        int length = requestCookieMap.size();
        String cookieName;
        if (cookie != null && cookie.length > 0) {
            for (Cookie cookie1 : cookie) {
                cookieName = cookie1.getName();
                switch (cookieName) {
                    case "user_cookie":
                        username = cookie1.getValue();
                        break;
                    case "password_cookie":
                        password = cookie1.getValue();
                        break;
                    case "remember_cookie":
                        remember_string = cookie1.getValue();
                        if (remember_string.equals("false")) {
                            remember = false;
                        } else if (remember_string.equals("true")) {
                            remember = true;
                        }
                        break;
                }
            }
        } else {
            //"Cannot find any cookie
        }
    }
}

Hope someone can help me with this. Btw this is my first day with jsf, i hope that i am not doing an obvious mistake. Also can someone tell me if my browser (in this case google chrome) can prevent my web app to save cookies?

Это было полезно?

Решение

See answer how to set and get cookies in JSF. It contents the code of CookieHelper class, which can be used multiple times in one application. Purpose of this class is separate cookies related code in one class which is not related to business logic.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top