Apache httpd mod_rewrite с Tomcat, приводящим к потерянному JSESSIONID

Я работаю над веб-приложением Java, для которого я недавно реализовал модуль аутентификации, который полагается на cookie JSESSIONID для идентификации пользователей. Я тестировал на локальном коте от затмения, и все хорошо работало... Пока я не развернул приложение на нашем VPS (Centos) с еще чем-то вроде структуры расширенной настройки:

  • Apache сервер HTTP

  • несколько виртуальных хостов

  • упомянутое веб-приложение смонтировано в виртуальном хосте с mod_jk. К этому в настоящее время получают доступ по 'sub.hostname.com/WEBAPP_NAME/home', но должно быть доступным с 'sub.hostname.com/home'.

Вышеупомянутая установка не была такой большой проблемой перед обновлением аутентификации (btw, доступ был обработан параметрами безопасности кота прежде). Старый VirtualHost был похож на это и хорошо работал:

<VirtualHost *:80>
    ServerName sub.hostname.com
    RewriteEngine on
    RewriteRule ^/(.+)$ /WEBAPP_NAME/$1 [L,PT]
    RewriteRule ^/$ /WEBAPP_NAME/home [L,PT]
    JkMount /* worker
</VirtualHost>

Проблема: После развертывания не работала бы аутентификация, потому что cookie JSESSIONID не был записан. Я удалил RewriteRules и получил доступ к приложению по 'sub.hostname.com/WEBAPP_NAME/home', где все хорошо работало снова, и я получил cookie. От этих наблюдений я предполагаю, что проблема из-за переписываемого URL и Сервлет, не пишущий cookie в корректный путь (?), если это так, я должен попытаться записать cookie в некоторый другой путь из приложения?

Там какие-либо определенные настройки должны высматривать в апаче или коте, который может обработать это? Или я первоначально выбирал неправильную архитектуру установки?

1
задан 28 September 2019 в 18:13
2 ответа

Я провел еще несколько исследований после прочтения предложений Седрика и нашел вот это: Настройка Apache, Tomcat, mod_jk и mod_rewrite для обслуживания tomcat с верхнего уровня

Я следовал инструкциям Кевина Лони (Kevin Loney) по изменению http заголовков непосредственно из Apache с помощью модуля mod_headers.

В конце концов, я просто должен был добавить следующую строку в конфигурацию VirtualHost, которая меняет все пути к куки-файлам с /WEBAPP_NAME на / (корневой):

Header edit Set-Cookie "^(.*; Path=)/WEBAPP_NAME/?(.*)" $1/$2

Альтернативный метод - изменить путь к куки-файлам из Tomcat:

Я также протестировал настройку пути к куки-файлам из Tomcat в web. xml моего приложения:

<session-config>
    <session-timeout>30</session-timeout>
    <cookie-config>
        <http-only>true</http-only>
        <path>/</path> <!-- changes the path -->
        <name>COOKIENAME</name>
    </cookie-config>
</session-config>

Получил пример web.xml из вопроса по адресу https://stackoverflow.com/questions/12755499/how-to-change-jsessionid-cookie-path-to-server-root-in-spring-app-on-jetty

0
ответ дан 4 December 2019 в 08:36

У вас есть несколько вариантов изменения пути к куки-файлам.

Проблема здесь в том, что перезаписывающее_управление в вашем apache conf и tomcat устанавливают путь к куки-файлам в /WEBAPP_NAME/.

В tomcat вы можете изменить путь к куки-файлу с помощью атрибута sessionCookiePath в контексте.

Вы также можете развернуть ваше веб-приложение в /переименовав войну на ROOT.war.

И, возможно, для изменения пути к куки-файлу будет использоваться mod_rewrite.

.
0
ответ дан 4 December 2019 в 08:36

Теги

Похожие вопросы