gpt4 book ai didi

cookies - 如何在 JSF 中添加 cookie?

转载 作者:行者123 更新时间:2023-12-01 16:24:27 24 4
gpt4 key购买 nike

当我添加如下 cookie 时:

FacesContext.getCurrentInstance().getExternalContext().addResponseCookie("Test", "Test", null);

然后它运行良好,但是 cookie 变成了一个 session cookie,最大年龄为 -1 .

当我尝试如下:
Map<String, Object> properties = new HashMap<>();
properties.put("domain", "test");
properties.put("maxAge", 31536000);
properties.put("secure", false);
properties.put("path","/");
FacesContext.getCurrentInstance().getExternalContext().addResponseCookie("Test", "Test", properties);

然后我在任何地方都看不到cookie。我不明白为什么。

我正在使用Tomcat 7。

最佳答案

您的具体案例失败,因为域设置错误。 Cookie 是特定于域的。您不能在不同的域上设置 cookie。如果不指定域,则默认为当前请求 URI 的域。 Cookie#setDomain()仅当您打算在常见或不同的 上设置 cookie 时才有用。子 领域。例如。如果你有 foo.example.combar.example.com ,然后您可以通过该方法为其他域设置cookie,或将域设置为.example.com (带前导句号!)在两个子域之间共享 cookie。

因此,这应该在您的特定情况下进行:

String name = "cookiename";
String value = "cookievalue";
Map<String, Object> properties = new HashMap<>();
properties.put("maxAge", 31536000);
properties.put("path", "/");
externalContext.addResponseCookie(name, URLEncoder.encode(value, "UTF-8"), properties);

请注意,如果您打算在 webapp 范围内使用 cookie,则显式设置路径非常重要,否则它默认为当前路径,当它第一次在子文件夹中设置时当然会失败。在任何父文件夹中都无法访问此类 cookie。上面的另一个答案没有正确考虑到这一点,因为它不必要且错误地重用了现有的 cookie,而不是创建全新的 cookie。另见 a.o. In Java servlet, cookie.getMaxAge() always returns -1 .

至于在 JSF 中检索 cookie,请使用 ExternalContext#getRequestCookieMap() :
Cookie cookie = (Cookie) externalContext.getRequestCookieMap().get(name);
String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
// ...

请注意,我在设置/检索之前对 cookie 值进行 URL 编码/解码,否则您会遇到以下相关问题中提出的问题: Why do cookie values with whitespace arrive at the client side with quotes?java.lang.IllegalArgumentException: Control character in cookie value or attribute .

也就是说,我同意 JSF API 在检索和设置 cookie 方面有些不透明。 JSF 实用程序库 OmniFacesseveral useful utility methods Faces utility class为此,它隐式地将健全的默认值设置为 cookie 属性,并对值进行 URL 编码/解码。
// Getting a cookie value.
String value = Faces.getRequestCookie(name);

// Setting a session cookie in current path.
Faces.addResponseCookie(name, value, -1);

// Setting a session cookie in current domain.
Faces.addResponseCookie(name, value, "/", -1);

// Setting a (sub)domain-wide session cookie.
Faces.addResponseCookie(name, value, ".example.com", "/", -1);

// Setting a cookie with max age of 1 year in current domain.
Faces.addResponseCookie(name, value, "/", (int) TimeUnit.DAYS.toSeconds(365));

// Removing a cookie from current domain.
Faces.removeResponseCookie(name, "/");

关于cookies - 如何在 JSF 中添加 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20934016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com