Как сохраненить сессии между rest-запросами в spring boot?
Добрый вечер всем, возникла проблема с сохранением сессий между запросами. Условно у меня имеются два метода(в разных контроллерах), обрабатывающие post-запросы. Первый метод login, сохраняющий сессию пользователя, второй метод обращается к сессии, но тут и возникла проблема. Прежде всего следует отметить, что сессия создается и это видно как по методу request.getSession().getAttribute("name"), написанного непосредственно после сохранения значения в сессию, так и в Mongo Compass, к слову бд для хранения сессий выбрана - Mongo, но при сравнении id этих двух сессий - выясняется, что эти сессии совершенно разные. Перепробовал все методы из статей, аналогичных проблем на Stack Overflow и тп.
Dmitry Roo, да, сессии не синхронизированы между методами. В одном методе у сессии один id, в другом методе у сессии уже новый id и при попытке обратиться к значению через ... .getAttribute("name") возвращается null
что-то с куками на стороне клиента?
клиент, получив session id в куках после login(), во второй раз не посылает ее на сервер, как следствие сервер создает новую сесию.
Никита Братский, покажите заголовоки запроса после login(), клиент должен отослать ту же самую JSESSIONID. если он ее отсылает, а на сервере нет сессии, значит сервер игнорит ее и нужно условный бряк ставить куда-нибудь в томкате и смотреть почему она пропала.
Сессии работают следующим образом: при создании сессии сервер отсылает заголовок Set-Cookie браузеру в котором сохраняет значение идентификатора сессии (JSESSIONID). При последующих запросах браузер посылает "печеньку" обратно серверу и тот, получив идентификатор, может восстановить сессию из своего хранилища. Если "печеньки" заблокированы, то возможно передать jsessionid как query param запроса. Но это уже требует дополнительных телодвижений на стороне клиента.
Так как вы упоминаете REST, то предположу использование XmlHttpRequest в браузере (напрямую или опосредованно через какую-то библиотеку), который не посылает заголовок Cookie по умолчанию.
Поэтому вариантом решения может быть отправка идентификатора сессии явным образом как query param с именем jsessionid.
Однако, использование сессии в REST запросах - в целом не очень хорошая практика, так как REST предполагается быть stateless. А в случае сессии у вас появляется состояние на стороне сервера. Если сессия нужна только для аутентификации клиента, то посмотрите на использование токенов, таких как JWT, которые позволяют решить эту проблему без наличия сессии на стороне сервера.