我使用弹簧靴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);
}
}
在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方法进行传递,在调试器转到I18nLocaleResolver之后,在db端进行更改。在这个地方,看到的是(EN)的旧值。有没有注销用户的刷新方法?
答案 0 :(得分:0)
某些缓存实现可能不支持从缓存中逐出,在这种情况下,它们应提供适当的行为以通过异常或日志消息在其文档中更改用户。
请尝试传递用户对象而不是userName。如果要更新缓存中的用户,请尝试使用putUserInCache(user)
这种方法