我尝试过使用
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");
}
}
答案 0 :(得分:1)
Spring Session JDBC不支持发布会话事件,因为在这方面存在明显的底层数据存储限制。关系数据库本身没有类似pub-sub的机制,可用于将事件传播到集群中的所有节点。
reference manual和JdbcOperationsSessionRepository
javadoc中都记录了这一点。
关于问题的第二部分,使用支持事件发布的会话存储(例如Redis和Hazelcast),Spring Session会将它发布的所有事件转换为标准Servlet API的HttpSessionEvent
实例。虽然你可以听Spring Session's event hierarchy,但建议通过标准的Servlet API机制来保持所有与会话相关的交互。
根据HttpSession
和HttpSessionListener#sessionDestroyed
,在会话无效时发布与到期/删除相关的会话事件。我不确定在会话过期之前收到的通知是什么意思,因为这是一个模糊的术语,取决于你对之前的的期望。