春天3.5。当用户登录然后注销并尝试再次登录时,他收到有关user \ pass的错误

时间:2014-07-28 09:37:14

标签: java spring spring-mvc spring-security

我有春季(4.0.6)网络应用程序。我注意到,当用户登录然后注销并尝试再次登录时会收到有关user \ pass的错误。 我没有web.xml文件,因为我使用SpringBootServletInitializer类来配置我的应用程序。 我已经添加了我的配置这样的bean

    @Bean
    public ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher()
    {
    return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
    }

在安全配置中我有这个:

 http.sessionManagement()
.maximumSessions(1).expiredUrl("/login?expired")
.maxSessionsPreventsLogin(true)
.and()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.invalidSessionUrl("/");

据我所知,之前的会话还活着,因为Maximum session = 1,用户无法再次登录。我该怎么办才能避免它?

1 个答案:

答案 0 :(得分:0)

他退出时应该invalidate the user session。下面是一段代码。需要传递用户ID。

UserInfoPOJO

public boolean invalidateUserSession(Long userId) {

    List<Object> principalsList = sessionRegistry.getAllPrincipals();
    Object targetPrincipal = null;
    for (Object principal : principalsList) {
        if (principal instanceof UserInfo) {
            if (((UserInfo) principal).getId().equals(userId)) {
                targetPrincipal = principal;
                break;
            }
        }
    }
    if (targetPrincipal == null) {
        return false;
    }

    List<SessionInformation> userSessionsList = sessionRegistry.getAllSessions(targetPrincipal, false);

    for (SessionInformation x : userSessionsList) {
        x.expireNow();
    }

    return true;
}