Я работаю над веб-приложением Java, для которого недавно реализовал модуль аутентификации, который использует файл cookie JSESSIONID для идентификации пользователей. Я тестировал локальный кот из eclipse, и все работало нормально ... Пока я не развернул приложение на нашем VPS (Centos) с немного более сложной структурой настройки:
HTTP-сервер Apache
несколько виртуальных хостов
указанное веб-приложение смонтировано на виртуальном хосте с помощью mod_jk. В настоящее время он доступен через sub.hostname.com/WEBAPP_NAME/home, но должен быть доступен через sub.hostname.com/home.
Вышеупомянутая настройка не была такой большой проблемой до обновления аутентификации (кстати, раньше доступ обрабатывался параметрами безопасности Tomcat). Старый 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, которые могут справиться с этим? Или я изначально выбрал неправильную архитектуру установки?
Прочитав предложения CédricC, я провел еще несколько исследований и обнаружил следующее: Настройка Apache, Tomcat, mod_jk и mod_rewrite для обслуживания tomcat с верхнего уровня
Я последовал инструкциям Кевина Лони, чтобы напрямую изменить заголовки http. из Apache используя mod_headers модуль.
В конце концов мне просто пришлось добавить следующую строку в мою конфигурацию VirtualHost, которая изменяет все пути файлов cookie с /WEBAPP_NAME
к / (root)
:
Header edit Set-Cookie "^(.*; Path=)/WEBAPP_NAME/?(.*)" $1/$2
Альтернативный метод - изменить путь cookie из Tomcat:
Я также протестировал установку пути cookie из 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
У вас есть несколько вариантов изменения пути к файлам cookie.
Проблема здесь в том, что rewrite_rule в вашей конфигурации apache и tomcat устанавливают путь cookie к / WEBAPP_NAME /.
В tomcat вы можете изменить путь cookie с помощью sessionCookiePath атрибут в контексте.
Вы также можете развернуть свое веб-приложение в /, переименовав war в ROOT.war.
И возможно, что mod_rewrite можно использовать для изменения пути cookie.