SessionLocaleResolver语言已更改,但看不到

时间:2019-02-12 03:52:38

标签: spring spring-boot

我使用弹簧靴2,弹簧安全装置。我为用户创建缓存。 在我的用户类别中,我有一个lang字段:FR,EN ... 允许用户选择所需的语言ui。

实际上,用户可以更改其语言。

@EnableCaching
public class CacheConfig {

    @Bean
    public UserCache userCache() throws Exception {

        return new SpringCacheBasedUserCache(new ConcurrentMapCache("userCache"));

    }
}

public class I18nLocaleResolver extends SessionLocaleResolver {

    @Override
    public Locale resolveLocale(HttpServletRequest request) {

        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null && !"anonymousUser".equals(auth.getPrincipal())) {
            CustomUserDetails user = (CustomUserDetails) auth.getPrincipal();

            String lang = user.getLang();
            if (lang == null) {
                lang = LanguagesEnum.FR.getLanguage();
            }
            Locale locale = new Locale(lang);

            WebUtils.setSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME, locale);

            return locale;
        }

        Locale locale = (Locale) WebUtils.getSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME);
        if (locale == null) {
            locale = determineDefaultLocale(request);
        }
        WebUtils.setSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME, locale);

        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
        WebUtils.setSessionAttribute(request, LOCALE_SESSION_ATTRIBUTE_NAME, locale);

    }

}

在UserDetailsS​​erviceImpl

@Transactional
    @Override
    public void updateLang(Integer userId, String newLanguage) {
        Optional<Users> optUserApp = repository.findById(userId);

        if (!optUserApp.isPresent()) {
            throw new UsernameNotFoundException("Username id " + userId + " not found");
        }

        Users user = optUserApp.get();

        user.setLang(newLanguage);

        repository.save(user);

        userCache.removeUserFromCache(user.getUsername());
    }

场景

用户lang是EN,因此将其更改为FR,我们通过updateLang方法进行传递,在调试器转到I18nLocaleResolver之后,在db端进行更改。在这个地方,看到的是(EN)的旧值。有没有注销用户的刷新方法?

1 个答案:

答案 0 :(得分:0)

  

某些缓存实现可能不支持从缓存中逐出,在这种情况下,它们应提供适当的行为以通过异常或日志消息在其文档中更改用户。

SpringCacheBasedUserCache

请尝试传递用户对象而不是userName。如果要更新缓存中的用户,请尝试使用putUserInCache(user)这种方法