如何在会话即将到期时收到通知?春季启动

时间:2018-02-14 21:47:46

标签: spring spring-boot spring-session

我尝试过使用

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包的解决方案。

我没有使用以下代码获取sessionDestroyedsessionCreated ..

 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");
   }
 }

1 个答案:

答案 0 :(得分:1)

Spring Session JDBC不支持发布会话事件,因为在这方面存在明显的底层数据存储限制。关系数据库本身没有类似pub-sub的机制,可用于将事件传播到集群中的所有节点。

reference manualJdbcOperationsSessionRepository javadoc中都记录了这一点。

关于问题的第二部分,使用支持事件发布的会话存储(例如Redis和Hazelcast),Spring Session会将它发布的所有事件转换为标准Servlet API的HttpSessionEvent实例。虽然你可以听Spring Session's event hierarchy,但建议通过标准的Servlet API机制来保持所有与会话相关的交互。

根据HttpSessionHttpSessionListener#sessionDestroyed,在会话无效时发布与到期/删除相关的会话事件。我不确定在会话过期之前收到的通知是什么意思,因为这是一个模糊的术语,取决于你对之前的的期望。