【问题标题】:JSF saving my cookies and getting empty arrayJSF 保存我的 cookie 并获取空数组
【发布时间】:2014-05-02 13:48:50
【问题描述】:

我正在使用用户名、密码和记住我选项构建一个简单的登录。像所有网页一样,我想保存密码和用户名(或自动登录访问者)。我尝试使用 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 的第一天,我希望我没有犯明显的错误。也有人能告诉我我的浏览器(在这种情况下是谷歌浏览器)是否可以阻止我的网络应用保存 cookie?

【问题讨论】:

  • 检查这个answer。这是设置和获取 cookie 的代码(在我的项目中运行良好)。
  • 问题可能与 cookie 过期时间有关 - 请参阅之前评论链接中的 cookie.setMaxAge(expiry);
  • @VasilLukach 我找不到设置最大年龄的任何问题。我试过你的代码,效果很好。您可以将其发布为答案,以便我可以将其标记为我的问题的解决方案。谢谢
  • 不客气。很高兴能提供帮助。

标签: java jsf cookies web


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 2022-01-02
    • 1970-01-01
    • 2018-05-20
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多