Pergunta

Eu tenho atualmente uma configuração de servidor HTTP Tomcat + Apache para servir o meu servlet Java:

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

Isto é tudo muito bem, exceto que as necessidades myservice saber o endereço IP do cliente, o que sempre acaba por ser 127.0.0.1 devido ao proxy. Existe uma solução para obter o endereço IP real? AJP é uma opção?

doGet(HttpServletRequest request, HttpServletResponse response){
    request.getRemoteAddr()
}
Foi útil?

Solução

Faça-o assim:

no apache config:

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

E, em seguida, em sua server.xml:

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

Isso deve passar tudo completamente. O protocolo AJP passa a informação, mas http:. Não

Você não pode querer seguras = "true", eu uso isso porque SSL é tratada na camada de apache e eu preciso Tomcat saber que a ligação deve ser considerado um seguro.

Outras dicas

Você pode ler o X-transmitido-Para no cabeçalho da solicitação.

A partir da Apache documentação mod_proxy :

Ao agir em um modo de proxy reverso-(usando a diretiva ProxyPass, por exemplo), mod_proxy_http adiciona vários cabeçalhos de solicitação, a fim de passar informações para o servidor de origem. Estes cabeçalhos são:

  • X-Forwarded-For :. O endereço IP do cliente
  • X-transmitido-Host :. O host original solicitado pelo cliente no cabeçalho da solicitação HTTP do host
  • X-transmitido-Servidor :. O hostname do servidor proxy

Tenha cuidado ao usar estes cabeçalhos no servidor de origem, uma vez que irá conter mais de um valor (separados por vírgula) se o pedido original já continha um desses cabeçalhos. Por exemplo, você pode usar% {X-Forwarded-For} i na cadeia de formato de log do servidor de origem para registrar os clientes originais endereço IP, mas você pode obter mais de um endereço se o pedido passa por vários proxies.

No seu servlet, você teria que:

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

isso é muito simples:

<VirtualHost> 

 ServerName www.server.com

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

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

</VirtualHost>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top