我尝试使用
public void onApplicationEvent(ApplicationEvent event)
{
if(event instanceof SessionDestroyedEvent){
和
@WebListener
public class SessionListener implements HttpSessionListener {
@Override
public void sessionDestroyed(HttpSessionEvent se) {
第一个,我根本没有得到SessionDestoryedEvent
事件。
似乎春天可能会在会议过期后通知我们。
是否有可靠的方法可以通知 before
会话过期?
最好是我不需要spring-session
软件包的解决方案。
我没有使用以下代码获得sessionDestroyed
或sessionCreated
。
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.annotation.WebListener;
import org.springframework.stereotype.Component;
@WebListener
public class MySessionListener implements HttpSessionListener {
private static int totalActiveSessions;
public static int getTotalActiveSession(){
return totalActiveSessions;
}
public MySessionListener()
{
System.out.println("MySessionListener -------------");
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
totalActiveSessions++;
System.out.println("sessionCreated - add one session into counter");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
totalActiveSessions--;
System.out.println("sessionDestroyed - deduct one session from counter");
}
}
春季会话JDBC不支持会话事件的发布,这是由于这方面的基础数据存储的明显限制。一个关系数据库本身没有类似的pub-sub机制,可用于将事件传播到集群中的所有节点。
参考手册和JdbcOperationsSessionRepository
Javadoc中都记录了这一点。
关于您问题的第二部分,支持事件发布的会话商店(例如Redis和Hazelcast(春季会议将其发布的所有事件转化为标准Servlet API的HttpSessionEvent
实例。虽然您可以收听春季会议的活动层次结构,以通过标准的Servlet API机制来保持所有相关的互动。
根据HttpSession
和HttpSessionListener#sessionDestroyed
,会话无效时,会议/删除有关的会话事件将发布。我不确定在会话过期之前获得通知到底是什么意思,因为这是一个模糊的术语,取决于您对之前的的期望。。