Я использую весеннюю сессию, и мне она очень нравится. Однако я думаю, что у меня что-то не хватает. В моем приложении поток выглядит следующим образом: 1) Пользователь запрашивает HomepageController
и контроллер пытается поставить атрибут в запросе:Сессия по первому требованию
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
final String sessionIds = sessionStrategy.getRequestedSessionId(request);
if (sessionIds != null) {
final ExpiringSession session = sessionRepository.getSession(sessionIds);
if (session != null) {
session.setAttribute("attr", "value");
sessionRepository.save(session);
model.addAttribute("session", session);
}
}
Как вы можете видеть, что это будет пытаться получить SESSIONID из запроса-печенья , и если в репозитории есть сеанс с этим идентификатором, чем использовать его (добавить атрибут). Это прекрасно, но только после второго запроса. Зачем? Потому что, если я перезапущу сервер, а cookie останется со старым значением, а затем первый запрос не найдет сессию в репозитории. После того, как ответ будет завершен, хотя cookie будет обновлен, так что запрос второй будет правильным. И вот вопрос: что не так с моей логикой и как разработать приложение для поддержки первого запроса?
Кстати, вот пример приложения, который демонстрирует проблему:
https://github.com/paranoiabla/spring-session-issue
Почему так сложно? вы можете просто получить сеанс и использовать его. Вся идея заключается в том, что она максимально прозрачна, вы должны просто использовать «HttpSession», а не свою сложную логику. –
Потому что, опять же, я работаю с сеансом около db-слоя (у меня есть «SessionService», который работает с «SessionRepository»), и он выглядит уродливым для работы с «HttpServletSession» рядом с db-слоем - он выглядит лучше, когда вы работаете с интерфейсом 'Session'. –
ИМХО вы не должны. Вы указываете, что этот код находится в контроллере, и это связано с сетью. Вы должны imho работать только с «HttpSession» и помещать туда вещи, сессия будет храниться для вас в рамках. Похоже, вы пытаетесь работать вокруг Spring Session вместо того, чтобы обнимать его. Я бы даже осмелился сказать, что ваш контроллер сложный. –