创建会话或过期会话时,是否可以运行函数?

时间:2019-04-14 01:10:46

标签: spring-boot spring-mvc spring-session

我目前正在计划一个需要在会话创建和过期时都运行功能的应用程序。我正在计划使用Redis之类的东西,但我愿意接受其他想法。我正在寻找的是n注释,例如@whenexpires和@whencreated。我知道大多数会话注释都在班上,而不是谢谢。

1 个答案:

答案 0 :(得分:0)

从Servlet规范2.3开始,Java Servlet容器(例如Apache Tomcat)提供了HttpSessionListener接口,以便在创建或破坏会话时执行自定义逻辑。基本用法:

package com.example;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionListener implements HttpSessionListener {

  @Override
  public void sessionCreated(HttpSessionEvent event) {
  }

  @Override
  public void sessionDestroyed(HttpSessionEvent event) {
  }
}

MySessionListener添加到您的web.xml中,或者-如果是Spring,则声明一个Spring可以检测到的Spring bean。但是,由于HttpSessionListener是Java Servlet规范的一部分,因此不需要Spring。

如果要通过Redis参加Spring Session,则可以按照official docs中的说明将HttpSessionListener添加到Spring配置中,继续使用。{p>

@EnableRedisHttpSession 
public class Config {

    @Bean
    public MySessionListener mySessionListener() {
        return new MySessionListener(); 
    }

    // more Redis configuration comes here...
}

此外,Spring Session附带了事件订阅和发布的“ Spring原生”方式的支持:ApplicationEvent。根据会话持久性方法的不同,当前您的应用程序最多可以捕获三个事件:SessionExpiredEventSessionCreatedEventSessionDestroyedEvent

实施EventListener以便订阅Spring Session事件,例如:

package com.example;

import org.springframework.context.event.EventListener;
import org.springframework.session.events.SessionCreatedEvent;
import org.springframework.session.events.SessionDestroyedEvent;
import org.springframework.session.events.SessionExpiredEvent;
import org.springframework.stereotype.Component;

@Component
public class MySessionEventListener {

    @EventListener
    public void sessionDestroyed(SessionDestroyedEvent event) {
    }

    @EventListener
    public void sessionCreated(SessionCreatedEvent event) {
    }

    @EventListener
    public void sessionExired(SessionExpiredEvent event) {
    }
}