代码之家  ›  专栏  ›  技术社区  ›  robert trudel

SessionLocalerResolver语言已更改,但未看到

  •  0
  • robert trudel  · 技术社区  · 6 年前

    我用弹簧靴2,弹簧安全。我为用户创建缓存。 在我的用户类中,我有一个lang字段:fr,en… 允许用户选择所需的语言用户界面。

    实际上,用户可以更改它的lang。

    @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);
    
        }
    
    }
    

    在userdetailsserviceimpl中

    @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方法传递,在db端更改它,调试器转到i18nlocalesolver之后。在这个地方,人们看到的是旧价值观。有没有办法在不注销用户的情况下刷新?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Muhammad Waqas    6 年前

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

    SpringCacheBasedUserCache

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