Я пытаюсь настроить свое Java-приложение в качестве основного компонента нового сайта.
У меня есть статические ресурсы, которые я хотел бы обслуживать с помощью Apache, поэтому я настраиваю Apache и Mod_jk со следующими правилами:
JkMount /java_app* ajp13
JkUnmount /*static/* ajp13
RewriteEngine On
RewriteRule ^/$ /java_app/ [L,PT]
Рабочие файл и все работает набухает. Когда я иду в http://www.example.com/, Я получаю индексный файл для своего Java-приложения из-за правила перезаписи. Если я просматриваю сайт, я все равно получаю свое java-приложение из-за mod_jk, например http://www.example.com/java_app/view/1/.
Проблема: когда я возвращаюсь в http://www.example.com, Я полностью теряю информацию о сеансе. Если я был авторизован, я выхожу из системы, а ссылки оттуда дополняются jsessionids.
Как это исправить? Это правильный способ подключения apache и tomcat или есть лучший способ?
РЕДАКТИРОВАТЬ:
Чтобы ответить на первый ответ,
Все еще немного застрял. Когда я загружаю firebug, я вижу это, когда перехожу к /
Set-Cookie JSESSIONID=8D63C9682E39B81F669E277ED07542E1; Path=/javaapp
Когда я просматриваю приложение java, я вижу, что тот же jsessionid
остается со мной - firebug говорит, что я отправляю заголовки запроса.
Когда я ударил /
опять же, я получаю это в ответ,
Set-Cookie JSESSIONID=5DC9F39CE85AB1E71B8D87EB9D485FE9; Path=/javaapp
Итак, я предполагаю, что Apache пересылает мой запрос без информации о моих файлах cookie, поэтому Tomcat дает мне новый? Могу ли я сказать mod_rewrite сказать ex. ^/$ /javaapp/;jsessionid={cookie}
?
Не использовать mod_jk2
(который в любом случае устарел), но используйте mod_proxy с участием ProxyPass и ProxyReversePass. Намного проще настроить, даже ваше исключение для статического содержимого можно легко выразить:
ProxyPass /statics !
ProxyPass / http://localhost:8080
ProxyPassReverse / http://localhost:8080
Недостаток, очевидно, заключается в том, что если приложение Java хочет прочитать IP-адрес клиента (и другую информацию о клиенте), оно получит вместо этого адрес Apache, поскольку он является проигрывающим прокси. В этой ситуации вам нужно будет использовать mod_jk
Установите worker.worker1.sticky_session = 1
Я говорю использовать mod_jk, так как он создан специально для tomcat ajp и хорошо поддерживается (каждый год они обновляются новыми функциями)
Я подозреваю, что это проблема пути к файлам cookie. Чтобы убедиться в этом, вы можете запустить отладчик HTTP и проанализировать HTTP-трафик.
Вы можете сделать это, используя mod_header в вашей конфигурации, который имеет функциональность, аналогичную mod_rewrite, но используется для изменения заголовков http.
Чтобы изменить все пути файлов cookie с / javaapp на /
Header edit Set-Cookie "^(.*; Path=)/javaapp/?(.*)" $1/$2
Или, если вы хотите полностью изменить путь cookie с / javaapp, чтобы сказать / my_java_app
Header edit Set-Cookie "^(.*; Path=)/javaapp/?(.*)" $1/my_java_app/$2
Спасибо обоим. Я согласен с тем, что это проблема пути к файлам cookie, или проблема с тем, что Apache не отправляет информацию cookie вперед, или что-то в этом роде.
Я закончил тем, что сделал Tomcat webapp ROOT, что привело к исчезновению проблем с путями файлов cookie, а также удаление корневого контекста / javapp из URL-адресов приятным побочным эффектом. В итоге я выбрал mod_proxy_ajp, так как его было легко настроить, и я нашел документацию по shibboleth, в которой указывалось, что это лучший вариант.
Кажется, что все это пространство - такое вуду, и каждый придумывает свое собственное решение, так что я мог бы также найти что-то, что работает, и просто запустить его ...