3

我正在尝试创建一个本地化的 JSF Web 应用程序,它允许用户通过下拉菜单选择一种语言。选择语言后,我会模拟重定向到同一页面但带有 URL 参数:

window.location.replace(urlToMyApp + '?locale=DE');

接下来,我在应用程序的 Web 过滤器中读取 'locale' 参数并将其写入具有相同名称的 cookie 中:

String localeValue = httpRequest.getParameter("locale");
Cookie cookie = new Cookie("locale", localeValue);
cookie.setMaxAge(-1);
cookie.setDomain(cookieDomain);
cookie.setPath(cookiePath);
httpResponse.addCookie(cookie);

现在,当我尝试在请求 bean init 方法中读取该 cookie 时,cookie 不可用。如果我通过下拉菜单选择另一种语言(例如 EN),则会在 init 方法中读取先前选择的语言(DE)。

我假设在下一个“请求 - 响应”周期之前,过滤器中写入的 cookie 不可用,有人可以确认吗?

如果这是真的,我想在选择另一种语言后立即翻译我的应用程序。

我认为我需要提及的只是一件事 - 语言下拉列表不是我的应用程序的一部分。它是包含多个应用程序(如门户)的某种框架的一部分。

4

1 回答 1

5

我假设在下一个“请求 - 响应”周期之前,过滤器中写入的 cookie 不可用,有人可以确认吗?

这是正确的。

您已将新 cookie 添加到响应中,而不是请求中。因此,任何从同一个请求中读取它的尝试都行不通。只有浏览器实际发送了 cookie,该 cookie 才会在请求中可用。但它只有在从之前的响应中获取 cookie 数据的情况下才能做到这一点。

如果这是真的,我想在选择另一种语言后立即翻译我的应用程序。

如果请求范围的 bean 由 CDI 管理@Named,那么只需将其注入过滤器并在那里设置区域设置。

@Inject
private Bean bean;

public void doFilter(...) {
    // ...

    bean.setLocale(locale);

    // ...
}

否则,如果它不是由 CDI 管理,而是由自 JSF 2.3 deprecated 管理@ManagedBean,则手动实例化它并将其置于请求范围内,以便 JSF 将重用相同的 bean。

public void doFilter(...) {
    // ...

    Bean bean = new Bean();
    bean.init(); // If necessary.
    bean.setLocale(locale);
    request.setAttribute("bean", bean); // "bean" is managed bean name.

    // ...
}

也可以看看:

于 2021-02-04T06:41:18.180 回答