Есть ли способ запустить функцию, когда сеанс создан или истек? - PullRequest
0 голосов
/ 14 апреля 2019

В настоящее время я планирую приложение, которое требует, чтобы функция выполнялась всякий раз, когда сеанс создается и истекает.Я планирую использовать что-то вроде Redis, но я открыт для других идей.Что я ищу, так это аннотации, такие как @whenexpires и @whencreated.Я знаю, что большинство аннотаций для сессий в классе, а не метод Спасибо в отношении.

1 Ответ

0 голосов
/ 14 апреля 2019

Начиная со спецификации 2.3 сервлета, контейнеры сервлетов Java, такие как 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 - объявите для него bean-компонент Spring, обнаруженный Spring.Однако Spring не требуется, поскольку HttpSessionListener является частью спецификации сервлета Java.

Если вы перейдете на Spring Session с Redis, вы можете продолжить использовать HttpSessionListener, добавив его в конфигурацию Spring, как описано в официальных документах .

@EnableRedisHttpSession 
public class Config {

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

    // more Redis configuration comes here...
}

Кроме того, Spring Session поставляется с поддержкой «родного» способа подписки и публикации событий: ApplicationEvent .В зависимости от подхода сохранения сеанса в настоящее время вашим приложением может быть отслежено до трех событий: SessionExpiredEvent, SessionCreatedEvent, SessionDestroyedEvent.

Реализация EventListener для подписки наСобытия весенней сессии, например:

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