我有春季(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,用户无法再次登录。我该怎么办才能避免它?
答案 0 :(得分:0)
他退出时应该invalidate the user session
。下面是一段代码。需要传递用户ID。
UserInfo
是POJO
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;
}