Как запретить Spring Boot добавлять сессионные куки? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть веб-приложение Spring Boot, которое я пытаюсь сделать без сохранения состояния. В моем WebSecurityConfigurerAdapter я установил

    http
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

Но приложение (которое использует шаблоны Thymeleaf) продолжает переписывать URL-адреса для изображений и сценариев, добавляя «;jsessionid=<some_session_id>» к имени файла. В дополнение к тому, что я готовлю ie Я не хочу, у него также есть неприятный побочный эффект: Spring Security блокирует запрос, потому что в URL-адресе его стоит точка с запятой!

Thymeleaf говорит об этом является целевым и желаемым поведением и говорит, что это не их ошибка: Thymeleaf просто просит «Servlet API» переписать URL, и что мы должны «настроить приложение на уровне контекста Tomcat» для решения проблемы.

Итак, как мне это сделать? У меня есть пользовательский повар JWT ie для авторизации, поэтому мне не нужен или не нужен сеансовый повар ie, разумеется, не в переписанных URL.

1 Ответ

1 голос
/ 19 февраля 2020

Поведение jsessionid не имеет никакого отношения к STATELESS.

Изначально контейнер сервлета не знает, поддерживает ли клиент (браузер) файлы cookie или нет.

Следовательно, при первом запросе к странице (обычно HTTP GET):

  1. Контейнер сервлета добавит ;jsessionid=... ко всем URL-адресам.
  2. Контейнер сервлета будет (пытаться) выполнить установить повара ie с помощью jsessionid.

При нажатии на ссылку или отправке формы (HTTP GET / POST) браузер отправит повара ie обратно на сервер , ЕСЛИ И ТОЛЬКО ЕСЛИ браузер в первую очередь принял настройку cook ie. Теперь контейнер сервлета может определить, был ли jsessionid получен поваром ie (передан через заголовок HTTP-запроса), или URL.

Если jsessionid произошел от повара ie, контейнер сервлета перестанет добавлять ;jsessionid=... к URL-адресам. Если jsessionid произошел от URL, который вы щелкнули, он продолжит добавлять ;jsessionid= ко всем URL.

Это не имеет никакого отношения к STATELESS или любой другой конфигурации SessionCreationPolicy.

Ознакомьтесь с документацией Spring Security для SessionCreationPolicy:

/** Always create an {@link HttpSession} */
ALWAYS,
/**
 * Spring Security will never create an {@link HttpSession}, but will use the
 * {@link HttpSession} if it already exists
 */
NEVER,
/** Spring Security will only create an {@link HttpSession} if required */
IF_REQUIRED,
/**
 * Spring Security will never create an {@link HttpSession} and it will never use it
 * to obtain the {@link SecurityContext}
 */
STATELESS

Обновление:

Чтобы отключить режим отслеживания через URL, установите следующее свойство:

server.servlet.session.tracking-modes: COOKIE

см .: https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html

...