如何解决Web 过滤器中设置的 Cookie 在请求 bean 中不可用 另见:
我正在尝试创建一个本地化的 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 不可用,有人可以确认吗?
如果这是真的,我想在选择另一种语言后立即翻译我的申请。
我认为我需要提及一件事 - 语言下拉列表不是我的应用程序的一部分。它是包含多个应用程序的某种框架的一部分(如门户)。
解决方法
我假设在下一个“请求 - 响应”周期之前写入过滤器的 cookie 不可用,有人可以确认吗?
没错。
您已将新 cookie 添加到响应,而不是请求。因此,任何从同一请求中读取它的尝试都不起作用。如果浏览器实际发送了 cookie,则该 cookie 将仅在请求中可用。但只有从之前的响应中获得了 cookie 数据,它才能做到这一点。
如果这是真的,我想在选择另一种语言后立即翻译我的申请。
如果请求范围的 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.
// ...
}
另见:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。