Я настраиваю Javalin как микросервис, предоставляя конечные точки API для своего приложения React. Локально Javalin работает на порту 7070, а React — на 3000 (через встроенный сервер с приложением create-react-app).
Я пытаюсь подключить службы входа/выхода из системы, и в моем контроллере входа в систему у меня есть этот код.
boolean isValid = User.isPasswordValid(u, password);
if (isValid)
{
ctx.sessionAttribute("currentUser", u.userHash);
}
В коде React он прослушивает успешный ответ от этого контроллера, а затем перенаправляет на страницу /dashboard. Страница /dashboard загружает данные, и я получаю данные, подходящие для пользователя, получая этот userHash из сеанса следующим образом:
String userHash = ctx.sessionAttribute("currentUser");
Однако это всегда возвращает ноль.
Похоже, это должно работать и даже соответствует коду руководства, размещенному на веб-сайте Javalin https://javalin.io/tutorials/пример веб-сайта.
Является ли тот факт, что код React и Javalin, работающие на разных серверах, не работают? Я попытался заменить sessionAttribute() на cookieStore(), и у него та же проблема с нулевым значением.
Изменить - добавление информации об ответе, показывающей JSESSIONID

Это пустая карта




После обсуждения с создателем Javalin правильный ответ — включить эту строку в создание сервера:
app.before(ctx -> ctx.header("Access-Control-Allow-Credentials", "true"));
и убедитесь, что ваш вызов JavaScript включает опцию:
credentials: "include",
попробуйте: ctx.sessionAttributeMap(); и перебери через него, посмотри что внутри.