Как создать экземпляр org.springframework.session.MapSession в моем загрузочном приложении Spring - PullRequest
1 голос
/ 14 июля 2020

Я работаю над управлением сеансами для загрузочного приложения Spring. В этом контексте я хотел бы сам создать экземпляр объекта MapSession в приложении с помощью id, созданного мной, чтобы я мог переопределить его текущее создание объекта MapSession следующим образом, что связано с потенциальным риском (https://neilmadden.blog/2018/08/30/moving-away-from-uuids/):

public MapSession() {
    this(generateId());
  }

private static String generateId() {
   return UUID.randomUUID().toString();
 }

Можно ли это сделать из приложения? Если да, может ли кто-нибудь дать несколько указателей / ссылку на код для того же? Спасибо.

EDIT

В связи с этим я прошел через это: https://github.com/spring-projects/spring-session/issues/1148 и связанные ссылки: https://github.com/spring-projects/spring-session/issues/11 и https://github.com/spring-projects/spring-session/pull/204.

Кажется, на данный момент нет способа отменить это, я имею в виду, что я не могу изменить идентификатор сеанса, созданный как приведенный выше фрагмент кода. Пожалуйста, поправьте меня, если я ошибаюсь.

Я просмотрел соответствующее сообщение SO: Как изменить или настроить идентификатор сеанса в проекте весенней сессии? , но не получил четкого представления о том, как реализовать собственный репозиторий сеансов.

Я пробовал реализовать настраиваемый репозиторий сеансов следующим образом:

@EnableSpringHttpSession
public class CustomSessionRepository implements SessionRepository<MapSession> {

  private Integer defaultMaxInactiveInterval;
  private  Map<String, Session> sessions = new ConcurrentHashMap<>();

  public CustomSessionRepository() {
      this.sessions = sessions;
  }

  public void setDefaultMaxInactiveInterval(int defaultMaxInactiveInterval) {
    this.defaultMaxInactiveInterval = defaultMaxInactiveInterval;
  }

  public void save(MapSession session) {
    if (!session.getId().equals(session.getOriginalId())) {
      this.sessions.remove(session.getOriginalId());
    }

    this.sessions.put(session.getId(), new MapSession(session));
  }

  public MapSession findById(String id) {
    Session saved = (Session)this.sessions.get(id);
    if (saved == null) {
      return null;
    } else if (saved.isExpired()) {
      this.deleteById(saved.getId());
      return null;
    } else {
      return new MapSession(saved);
    }
  }

  public void deleteById(String id) {
    this.sessions.remove(id);
  }

  public MapSession createSession() {
    MapSession result = new MapSession(myCustomId());
    if (this.defaultMaxInactiveInterval != null) {
      result.setMaxInactiveInterval(Duration.ofSeconds((long)this.defaultMaxInactiveInterval));
    }

    return result;
  }
}

Но здесь я что-то упустил, потому что теперь сеанс не сохраняется в Redis, как ожидалось .

...