有没有办法在会话创建或过期时使用函数 运行?

Is there a way to have a function run when a session is created or expired?

我目前正在计划一个应用程序,该应用程序需要一个函数来 运行 每当会话创建和过期时。我打算使用像 redis 这样的东西,但我对其他想法持开放态度。我正在寻找的是一个 n 注释,例如@whenexpires 和@whencreated。我知道会话的大部分注释都在 class,而不是方法。谢谢。

从 Servlet 规范 2.3 开始,Java 像 Apache Tomcat 这样的 Servlet 容器提供了 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 bean,它被 Spring 检测到。但是,Spring 不是必需的,因为 HttpSessionListener 是 Java Servlet 规范的一部分。

如果您使用 Redis 进行 Spring 会话,您可以继续使用 HttpSessionListener,方法是将其添加到 Spring 配置中,如 official docs 中所述。

@EnableRedisHttpSession 
public class Config {

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

    // more Redis configuration comes here...
}

此外,Spring Session 支持 "Spring-native" 事件订阅和发布方式:ApplicationEvent。根据会话持久性方法,当前最多可以由您的应用程序捕获三个事件:SessionExpiredEventSessionCreatedEventSessionDestroyedEvent.

实施 EventListener 以订阅 Spring 会话事件,例如:

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) {
    }
}