我用弹簧靴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之后。在这个地方,人们看到的是旧价值观。有没有办法在不注销用户的情况下刷新?