Я работаю над веб-приложением 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 в некоторый другой путь из приложения?
Там какие-либо определенные настройки должны высматривать в апаче или коте, который может обработать это? Или я первоначально выбирал неправильную архитектуру установки?
Я провел еще несколько исследований после прочтения предложений Седрика и нашел вот это: Настройка 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
У вас есть несколько вариантов изменения пути к куки-файлам.
Проблема здесь в том, что перезаписывающее_управление в вашем apache conf и tomcat устанавливают путь к куки-файлам в /WEBAPP_NAME/.
В tomcat вы можете изменить путь к куки-файлу с помощью атрибута sessionCookiePath в контексте.
Вы также можете развернуть ваше веб-приложение в /переименовав войну на ROOT.war.
И, возможно, для изменения пути к куки-файлу будет использоваться mod_rewrite.
.