Ответ 1
В Spring Security 3.0.0 M1 или новее вы можете установить disable-url-rewriting="true"
в пространстве имен <http>
. Посмотрите, поможет ли это. Также см. Этот запрос функции.
Когда клиент, не прошедший проверку подлинности, запрашивает URL-адрес, для которого требуется неанонимный уровень доступа, как определено в security-config.xml
, защита spring отправляет перенаправление HTTP на нашу страницу входа (например, /login
). Это прекрасно.
Проблема заключается в том, что отсутствует существующий сеанс (указанный cookie, предоставленный в запросе клиента), spring -security вызывает перенаправление, которое также указывает новый сеанс клиента в URL-адресе, например. /login;jsessionid=8o7pglapojus
.
Многие контейнеры поддерживают это (видимо, он отлично работает в tomcat?), но похоже, что Jetty (именно это мы сейчас используем) не перенаправляет URL-адрес на наш URL-маршрутизатор полностью неповрежденным (в том числе параметр jsessionid
"), и именованный сеанс не связан с запросом /login
по вызову jetty/spring -security (т.е. полностью новый идентификатор сеанса представлен в заголовке Set-Cookie ответа на /login
).
Мы можем обойти это, сопоставляя /login.*
на наших маршрутах, но мне любопытно, есть ли способ предотвратить выброс идентификатора сеанса в перенаправление аутентификации для начала.
В Spring Security 3.0.0 M1 или новее вы можете установить disable-url-rewriting="true"
в пространстве имен <http>
. Посмотрите, поможет ли это. Также см. Этот запрос функции.
Теперь это выглядит так.
<security:http auto-config="false" use-expressions="true" disable-url-rewriting="true">
После этого ваше приложение будет неспособно выполнять корректные задания должным образом.
Другое решение здесь (для тех Spring Безопасность вообще я сам)
http://randomcoder.com/articles/jsessionid-considered-harmful
Создает оболочку фильтра сервлета и управляет этим способом.
@ahmet alp balkan:
seamframework обеспечивает лучшее решение, чем случайные кодеры. http://seamframework.org/Documentation/RemovingJSESSIONIDFromYourURLsAndFixingScache
@BalusC:
Если разработчик использовал spring security FilterChainProxy для реализации функции securtiy, просто не используя пространство имен http.
Тогда мы не смогли найти способ добавить disable-url-rewriting, не пытаясь добавить настраиваемый фильтр для фильтрации цепочки или вставить независимый фильтр в web.xml.
Поскольку вы используете jetty, просто добавьте следующий тег context-param в свой web.xml,
<!-- Disables appending JSESSSIONID in browser address bar/requests -->
<context-param>
<param-name>org.eclipse.jetty.servlet.SessionIdPathParameterName</param-name>
<param-value>none</param-value>
</context-param>
Обратитесь: Управление сеансом - Jetty Doc