Web 过滤器中设置的 Cookie 在请求 bean 中不可用

Cookie set in web filter is not available in request bean

我正在尝试创建一个本地化的 JSF 网络应用程序,它允许用户通过下拉菜单 select 一种语言。当语言为 selected 时,我模拟重定向到同一页面但使用 URL 参数:

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

接下来,我在应用程序的网络过滤器中读取 '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 初始化方法中读取该 cookie 时,cookie 不可用。如果我通过下拉列表 select 另一种语言(例如 EN),则在 init 方法中读取先前 selected 语言(DE)。

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

如果这是真的,我想征求意见,以便在 select 使用另一种语言后立即翻译我的申请。

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

I assume that cookie written in filter is not available before next "request - response" cycle, can someone confirm that?

没错。

您已将新 cookie 添加到 响应,而不是请求。因此,任何试图从同一个请求中读取它的尝试都不会奏效。如果浏览器实际发送了 cookie,则该 cookie 仅在请求中可用。但只有从之前的响应中获得了 cookie 数据,它才能这样做。

If that's true I'm asking for an idea to translate my application immediately after selecting another language.

如果请求作用域 bean 由 CDI @Named 管理,则只需将其注入过滤器并在那里设置语言环境。

@Inject
private Bean bean;

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

    bean.setLocale(locale);

    // ...
}

否则,如果它不是由 CDI 管理,而是由于 JSF 2.3 已弃用 @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.

    // ...
}

另请参阅:

  • Get JSF managed bean by name in any Servlet related class
  • Localization in JSF, how to remember selected locale per session instead of per request/view