Я работаю над управлением сеансами для загрузочного приложения 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, как ожидалось .