spring - 为什么 spring-vaadin 忘记了我设置的语言环境,但在页面刷新后突然记住了?

标签 spring vaadin vaadin8 vaadin4spring

情况 :我有一个 vaadin-spring 应用程序,我必须让用户在登录时更改语言。我在登录页面使用组合框在语言环境之间切换。 spring 语言环境解析器实现是 CookieLocaleResolver 因为我想将下次访问的选定选项存储在 cookie 中。

@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver localeResolver = new CookieLocaleResolver();
    localeResolver.setDefaultLocale(new Locale("de", "DE"));
    localeResolver.setCookieName("locale");
    localeResolver.setCookieMaxAge( 60 * 60 * 24 * 31);
    return localeResolver;
}

看法:
@SpringView(name = "login")
public class LoginView implements View {
    @Autowired
    private HttpServletRequest request;

    @Autowired
    private HttpServletResponse response;

    @Autowired
    private LocaleResolver localeResolver;

    ComboBox<LanguageOption> languageField;
    // ...
    languageField.addValueChangeListener(option -> {
        localeResolver.setLocale(request, response, option.getValue().getLocale());
    });
    // ...
}

更改组合框会将名为 locale 的 cookie 设置为所需的语言区域设置(例如 de_DE)。语言环境解析器中的默认语言是 de_DE。在登录时,我可以在两个选项之间切换:de_DE 和 en_US。

vaadin View 中的标题和文本翻译由 spring messageSource 完成:
someCompoenent.setCaption(messageSource.getMessage("someComponent.caption", args, LocaleContextHolder.getLocale()));

在 Vaadin UI 中,我调用以下内容来设置 session 和 UI 上的区域设置:
public class MyUI extends UI implements ViewDisplay, ViewAccessControl {
    @Autowired
    private HttpServletRequest httpServletRequest;

    // ...
    @Override
    protected void init(VaadinRequest request) {
        // ...
        Locale currentLocale = localeResolver.resolveLocale(httpServletRequest);
        LocaleContextHolder.setLocale(currentLocale);

        setLocale(currentLocale);
        VaadinSession.getCurrent().setLocale(currentLocale);

        // ...
    }

}

我的问题是 :当我在登录页面的语言组合框中选择 de_DE 语言环境并登录时,LocaleContextHolder.getLocale() 返回 en_US 并且 UI 为英文。但是,如果我在浏览器上按 F5 并刷新页面,则 UI 变为 de_DE。

为什么?

注意:我注意到在登录之前和登录之后 JESSSONID cookie 发生了变化。我不知道在存在语言环境 cookie 时解析语言环境是否重要,并且登录前后相同。

最佳答案

问题是过滤器链中有一个 RequestContextFilter,它在每个请求中用默认值覆盖 localeResolver 解析的区域设置。

快速解决方案是在消息服务中手动解析语言环境:

Locale locale = localeResolver.resolveLocale(SpringVaadinServletRequest.getCurrent());

并使用此语言环境进行翻译。

关于spring - 为什么 spring-vaadin 忘记了我设置的语言环境,但在页面刷新后突然记住了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48651030/

相关文章:

java - GlobalSession 范围的 beans 是否从 spring 5 中删除了?为什么?

java - Vaadin 网格不会在事件中刷新

java - 如何在 Vaadin 8 中从子线程获取访问 UI 线程

java - Spring jdbc 模板中的 BadSqlGrammarException

java - 如果当前 url 不以 "/"(斜杠)结尾,则链接不起作用

vaadin - Vaadin 有什么建议/库可以最大限度地减少 DOS 或 DDOS 攻击吗?

vaadin - 如何垂直对齐 Vaadin 网格中单元格的内容?

java - Vaadin 8 带标签和按钮的水平布局

java - Spring 安全: provide access depending on service call

java - 如何查找具有相同列值的多行并将其添加到一行并设置为 vaadin 网格