Вопрос

В настоящее время у меня есть настройка HTTP-сервера Tomcat + Apache для обслуживания моего Java-сервлета:

ProxyPass /myservice http://localhost:8080/myservice
ProxyPassRerverse /myservice http://localhost:8080/myservice

Все это прекрасно, за исключением того, что myservice необходимо знать IP-адрес клиента, который всегда оказывается 127.0.0.1 из-за прокси.Есть ли решение для получения реального IP-адреса?Является ли AJP вариантом?

doGet(HttpServletRequest request, HttpServletResponse response){
    request.getRemoteAddr()
}
Это было полезно?

Решение

Сделай это вот так:

в конфигурации apache:

<Location /foo>
  ProxyPass ajp://localhost:8009/foo
  ProxyPassReverse ajp://localhost:8009/foo
</Location>

И тогда в вашем server.xml:

<Connector port="8009" 
           enableLookups="false" secure="true" URIEncoding="UTF-8"
           tomcatAuthentication="false"
           protocol="AJP/1.3" />

Это должно пройти через все.Протокол AJP передает информацию, но http:не делает.

Возможно, вам не нужен secure ="true", я использую это, потому что SSL обрабатывается на уровне apache, и мне нужно, чтобы tomcat знал, что соединение следует считать безопасным.

Другие советы

Вы можете прочитать X-Forwarded-For в заголовке запроса.

Из Документация Apache mod_proxy:

При работе в режиме обратного прокси (например, с использованием директивы ProxyPass) mod_proxy_http добавляет несколько заголовков запроса для передачи информации на исходный сервер.Эти заголовки являются:

  • X-Пересланный-Для:IP-адрес клиента.
  • X-Перенаправленный Хост:Исходный хост, запрошенный клиентом в заголовке HTTP-запроса Host.
  • X-Перенаправленный Сервер:Имя хоста прокси-сервера.

Будьте осторожны при использовании этих заголовков на исходном сервере, поскольку они будут содержать более одного значения (через запятую), если исходный запрос уже содержал один из этих заголовков.Например, вы можете использовать %{X-Forwarded-For}i в строке формата журнала исходного сервера для регистрации IP-адресов исходных клиентов, но вы можете получить более одного адреса, если запрос проходит через несколько прокси.

В вашем сервлете вы бы имели:

doGet(HttpServletRequest request, HttpServletResponse response){
  request.getHeader("X-Forwarded-For")
}

это очень просто:

<VirtualHost> 

 ServerName www.server.com

 redirect / http://www.server.com/foo

 ProxyRequests off
 ProxyPass / ajp://localhost:8009/

</VirtualHost>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top