在LocaleChangeInterceptor中自动验证身份验证,以便在DB中存储lang不起作用

时间:2017-01-10 23:48:59

标签: java spring spring-boot spring-security

我想将用户的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);
        }
    }

}

1 个答案:

答案 0 :(得分:2)

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

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