Назад | Перейти на главную страницу

Apache httpd mod_rewrite с Tomcat приводит к потере JSESSIONID

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

Вышеупомянутая настройка не была такой большой проблемой до обновления аутентификации (кстати, раньше доступ обрабатывался параметрами безопасности 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.