Question

J'ai actuellement un serveur HTTP Apache mise Tomcat + pour servir mon servlet Java:

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

Tout cela est bien, sauf que myservice a besoin de connaître l'adresse IP du client, qui se révèle toujours être 127.0.0.1 en raison de la procuration. Y at-il une solution pour obtenir l'adresse IP réelle? Est-AJP une option?

doGet(HttpServletRequest request, HttpServletResponse response){
    request.getRemoteAddr()
}
Était-ce utile?

La solution

Faites comme ceci:

dans la configuration apache:

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

Et puis dans votre server.xml:

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

Cela devrait passer tout à travers. Le protocole AJP passe l'info, mais http:. Ne pas

Vous ne voulez pas sûr = « true », j'utilise parce que SSL est traitée à la couche apache et je dois tomcat savoir que la connexion doit être considérée comme une sécurité.

Autres conseils

Vous pouvez lire la Pour X-Forwarded dans l'en-tête de demande.

De la documentation Apache mod_proxy :

  

Lorsqu'il agit en mode reverse-proxy (en utilisant la directive ProxyPass, par exemple), mod_proxy_http ajoute plusieurs têtes de requête afin de transmettre des informations au serveur d'origine. Ces en-têtes sont:

     
      
  • X-Forwarded-For :. L'adresse IP du client
  •   
  • X-Forwarded-hôte :. L'hôte original demandé par le client dans l'en-tête de requête HTTP hôte
  •   
  • X-Forwarded-serveur : Le nom d'hôte du serveur proxy
  • .   
     

Soyez prudent lorsque vous utilisez ces en-têtes sur le serveur d'origine, car ils contiennent plus d'une valeur (séparés par des virgules) si la demande initiale contenait déjà l'un de ces en-têtes. Par exemple, vous pouvez utiliser% {X-Forwarded-For} i dans la chaîne de format de journal du serveur d'origine pour enregistrer l'adresse IP Les clients d'origine, mais vous pouvez obtenir plus d'une adresse si la demande passe par plusieurs mandataires.

vous dans votre servlet, avoir:

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

est très simple:

<VirtualHost> 

 ServerName www.server.com

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

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

</VirtualHost>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top