2009-09-24 3 views
0

В производстве мы запускаем tomcat за apache, в разработке bare tomcat. Как я могу узнать внутри класса Servlet, если он работает за Apache или нет?Как узнать, работает ли Tomcat за Apache?

+0

Если вы добавите _why_, вы хотите сделать это, мы сможем помочь решить вашу проблему, вместо ответа на вопрос .. – Tim

+0

У вас может быть apache добавить пользовательский HTTP-заголовок. Я считаю, что это довольно легко. Теперь это предполагает, что вы контролируете свою производственную среду - как заметил один из комментаторов ниже, если вы этого не сделаете, заголовок может потеряться .. – MJB

ответ

2

Это зависит от того, как Apache разговаривает с Tomcat.

Если он подключен через HTTP (mod_proxy), вы можете проверить request.getRemoteAddr(). Это будет IP-адрес Apache, возможно, ваш внутренний IP-адрес. Вы также можете проверить заголовок «Via», чтобы узнать, есть ли Apache.

Если он подключен через AJP (mod_jk/mod_proxy_ajp), вы можете проверить request.getLocalPort(), чтобы узнать, является ли это портом вашего JK-коннектора.

2

Если это необходимо для разграничения между производственной и производственной средой, то вам, вероятно, будет лучше, если бы это полностью под вашим контролем, а не ad-hoc угадывание (которое в конечном итоге сломается).

Это может быть «Есть функция X, установленная в JNDI?» или «Свойство foo.bar установлено в c: /ourproject.properties». Вы не должны полагаться на такие артефакты, как «класс X, загруженный из файла или найденный в банке» (так как это изменится, если вы измените серверы приложений) или «Будет ли HTTP-строка заголовка X присутствовать», поскольку это вне вашего контроля плюс это может нарушиться, если кто-то другой использует Apache в качестве стороннего accellerator.

Таким образом, явная конфигурация - это можно сделать довольно легко :)

Смежные вопросы