Pregunta

Actualmente tengo el establecimiento de un servidor Tomcat + Apache HTTP para servir a mi servlet Java:

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

Esto es todo bien, excepto que myservice necesita saber la dirección IP del cliente, que siempre resulta ser 127.0.0.1, debido al proxy. ¿Hay una solución para obtener la dirección IP real? Es una opción AJP?

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

Solución

hacerlo de esta manera:

en la configuración de Apache:

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

Y a continuación, en su server.xml:

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

Esto debería pasar a través de todo. El protocolo AJP pasa la información, pero http:. Hace no

Es posible que no quiera seguro = "true", utilizo que debido SSL se maneja en la capa de Apache Tomcat y necesito saber que la conexión debe ser considerado un ser seguro.

Otros consejos

Puede leer el X-reenviado-A en el encabezado de la solicitud.

Desde el Apache mod_proxy documentación :

  

Al actuar en un modo de proxy inverso (usando la directiva ProxyPass, por ejemplo), mod_proxy_http añade varias cabeceras de petición con el fin de pasar la información al servidor de origen. Estas cabeceras son:

     
      
  • X-reenviado-A . La dirección IP del cliente
  •   
  • X-reenviado-Host . El huésped original solicitado por el cliente en el encabezado de la solicitud HTTP Host
  •   
  • X-reenviado-servidor : El nombre de host del servidor proxy
  • .   
     

Tenga cuidado al usar estos encabezados en el servidor de origen, ya que contendrán más de un valor (separados por comas) si la solicitud original ya contenía uno de estos encabezados. Por ejemplo, puede utilizar% {X-reenviado-para} i en la cadena de formato de registro del servidor de origen para registrar la dirección de los clientes IP original, pero puede que tenga más de una dirección si la solicitud pasa a través de varios servidores proxy.

En el servlet, tendría que:

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

esto es muy simple:

<VirtualHost> 

 ServerName www.server.com

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

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

</VirtualHost>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top