【问题标题】:Cookie set in web filter is not available in request beanWeb 过滤器中设置的 Cookie 在请求 bean 中不可用
【发布时间】:2021-05-05 12:45:27
【问题描述】:

我正在尝试创建一个本地化的 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 初始化方法中读取该 cookie 时,cookie 不可用。如果我通过下拉菜单选择另一种语言(例如 EN),则会在 init 方法中读取先前选择的语言 (DE)。

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

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

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

【问题讨论】:

    标签: jsf cookies localization servlet-filters requestscope


    【解决方案1】:

    我假设过滤器中写入的 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.
    
        // ...
    }
    

    另见:

    【讨论】:

    • 感谢您的解释。关于您的建议 - 在过滤器中实例化请求 bean 很可能会解决我的问题。但问题是,在我的“框架”中运行的许多应用程序都使用相同的过滤器,所以我想我需要从我的所有应用程序中实例化所有请求 bean,对吧?
    • 或者将其拆分为另一个 bean,然后将其注入“来自所有应用程序的所有请求 bean”。
    • 听起来不错,谢谢。同时,我正在考虑将语言环境值保存为会话属性。值应该在同一个请求-响应周期中可用,对吧?
    • 只需将新拆分的 bean 设为 @SessionScoped 而不是 @RequestScoped
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2021-12-18
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多