在 LocaleChangeInterceptor 中自动连接身份验证以将 lang 存储在数据库中不起作用



我想将用户的 lang 存储在数据库中。因此,我扩展了 LocaleChangeInterceptor 并将旧的区域设置与新的区域设置进行比较。

如果更改,我想更新数据库中的用户属性。但身份验证对象不会自动连线。

有什么想法吗?

public class CustomLocaleChangeInterceptor extends LocaleChangeInterceptor {
    @Autowired(required = false)
    Authentication authentication;
    @Autowired
    UserService userService;
    private String oldLanguage;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws ServletException {
        oldLanguage = LocaleContextHolder.getLocale().toString();
        return super.preHandle(request, response, handler);
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
        String newLanguage = LocaleContextHolder.getLocale().toString();
        // stores new user language if changed
        if (authentication != null && oldLanguage != newLanguage) {
            CurrentUser currentUser = (CurrentUser) authentication.getPrincipal();
            User user = userService.getUserById(currentUser.getUser().getId());
            user.setLang(newLanguage);
            userService.save(user);
        }
    }
}

我不认为Authentication是由 spring 管理的,所以你能尝试使用以下代码来获取Authentication.

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

相关内容

最新更新