java - JSF 保存我的 cookie 并获取空数组

标签 java jsf cookies web

我正在使用用户名、密码和记住我选项构建一个简单的登录。像所有网页一样,我想保存密码和用户名(或自动登录访问者)。我尝试使用cookie,但是当我尝试加载它们时:

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

我得到一个空数组。我多次调试代码,但仍然不知道为什么会得到一个空数组。每次使用以下代码启用“记住我”功能时,我都会保存 cookie:

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

这是我的 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
        }
    }
}

希望有人能帮助我解决这个问题。顺便说一句,这是我使用 jsf 的第一天,我希望我没有犯一个明显的错误。另外有人可以告诉我我的浏览器(在本例中为 google chrome)是否可以阻止我的网络应用程序保存 cookie?

最佳答案

参见answer如何在 JSF 中设置和获取 cookie。它包含CookieHelper类的代码,该类可以在一个应用程序中多次使用。该类的目的是将与 cookie 相关的代码单独放在一个类中,与业务逻辑无关。

关于java - JSF 保存我的 cookie 并获取空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23429776/

相关文章:

php - Symfony 5 - 黑豹 : invalid cookie domain

php - 如何检查用户是否通过 Laravel 上的 cookie session 进行身份验证?

jsf - 如何使用 p :blockUI with p:tabView

java - Selenium TouchEvent 在设备模拟中不起作用

java lucene 停用词列表

java - 当所有数据结构都具有有效值时,数组列表和三个数组的客户适配器不会填充 ListView

jsf - JSTL c :forEach does not iterate through a collection

java - 具有不同值类型的建议和组件值的 Primefaces 自动完成组件

c# - 如何在我的 ASP.net Core 应用程序中同时使用 Bearer 和 Cookie 身份验证?

java - 当前运行的类或 JAR 文件的位置