Java 注销会话作用域bean后的Spring引导未更改

Java 注销会话作用域bean后的Spring引导未更改,java,spring,spring-boot,Java,Spring,Spring Boot,我用的是弹簧靴和百里香。当一个用户注销和另一个用户登录时,如果我访问 SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 它直接显示新用户。但是如果我自动连接定义为 @Bean(name = "loggedInUser") @SessionScope public UserMaster userMaster() { UserMaster user; try {

我用的是弹簧靴和百里香。当一个用户注销和另一个用户登录时,如果我访问

    SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
它直接显示新用户。但是如果我自动连接定义为

@Bean(name = "loggedInUser")
@SessionScope
public UserMaster userMaster() {
    UserMaster user;
    try {
        user = (UserMaster) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        user.setAuthorities(userService.getUserAuthorities(user.getUserId()));

    } catch (Exception e) {
        // TODO Auto-generated catch block
        System.out.println("user Not logged in");
        user = new UserMaster();
    }
    return user;
}
它显示了老用户

我的注销安全配置为

            .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .deleteCookies("JSESSIONID").clearAuthentication(true)
            .invalidateHttpSession(true).permitAll()
            
若bean是会话作用域,并且我们在注销时使会话无效,那个么为什么它会显示旧数据

请帮帮我,我做错了什么


谢谢

此配置没有问题。问题是,在发送到视图之前,我在哪里自动连接了我修改过的bean。但是我仍然不明白为什么它保留了旧值(我猜是缓存),
使用不同的对象查看解决了问题。

是否确定调用了“/logout”并应用了注销逻辑?您可以添加
.logoutSuccessHandler()
来验证注销是否成功。顺便说一句,为什么不简单地使用
.logout().logoutUrl(“/logout”)
而不是
AntPathRequestMatcher
?是的,将应用注销逻辑。它在注销时重定向到登录页面。我按照您的建议使用logoutSuccessHandler再次进行了测试。您是否验证了bean是否按预期工作,并且确实在会话范围内,例如在不同浏览器中登录两个不同的用户时,是否持有正确的身份验证对象?是的,它确实工作。事实上,如果用户有不同的角色,但如果用户有相同的角色(刚刚意识到这一点),它就可以正常工作。问题可能是由您的设置引起的。