我試圖在HTTP會話銷燬時記錄消息。 我在這個Web應用程序中使用Spring Boot,Spring Security和Tomcat 8(嵌入式)。HttpSessionListener.sessionDestroyed()方法在會話超時期間被調用兩次
在會話超時期間,sessionDestroyed()方法被調用2次,所以我的消息被記錄了兩次。
我在兩次調用期間都檢查了會話ID和會話ID是SAME。
這是我的代碼看起來像......
import org.springframework.security.core.session.SessionRegistry;
...
@Component
public class MySessionListener implements javax.servlet.http.HttpSessionListener, ApplicationContextAware {
@Autowired(required = false)
SessionRegistry sessionRegistry;
和sessionDestroyed()如下。
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
SecurityContextImpl springSecurityContext = (SecurityContextImpl)session.getAttribute("SPRING_SECURITY_CONTEXT");
if(springSecurityContext!=null){
Authentication authentication = springSecurityContext.getAuthentication();
LdapUserDetails userDetails = (LdapUserDetailsImpl)authentication.getPrincipal();
WebAuthenticationDetails WebAuthenticationDetails = (WebAuthenticationDetails)authentication.getDetails();
String userIp = WebAuthenticationDetails.getRemoteAddress();
Log.info(userDetails.getUsername(),userIp,timestamp,"timeout or logout","session destroyed");
}
sessionRegistry.removeSessionInformation(se.getSession().getId());
logger.info("Due to timeout/logout Session is Destroyed : Session ID is..." + session.getId());
}
任何幫助將不勝感激...
注:我注意到這個問題是一個缺陷的Tomcat 5,我不認爲缺陷是仍然在Tomcat中8不固定。
參考:https://bz.apache.org/bugzilla/show_bug.cgi?id=25600