Domanda

Al momento ho l'impostazione di un server Tomcat + Apache HTTP per servire il mio servlet Java:

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

Questo è tutto bene, tranne che myservice ha bisogno di conoscere l'indirizzo IP del client, che risulta sempre essere 127.0.0.1 a causa del proxy. C'è una soluzione per ottenere il vero indirizzo IP? AJP è un'opzione?

doGet(HttpServletRequest request, HttpServletResponse response){
    request.getRemoteAddr()
}
È stato utile?

Soluzione

fare in questo modo:

nella configurazione di apache:

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

E poi nel vostro server.xml:

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

Questo dovrebbe passare tutto attraverso. Il protocollo AJP passa informazioni, ma http:. Non fa

Non si può decidere sicuro = "true", io uso che, a causa di SSL viene gestita a livello di Apache Tomcat e ho bisogno di sapere che la connessione dovrebbe essere considerato uno sicuro.

Altri suggerimenti

È possibile leggere l'X-Forwarded-For nell'intestazione della richiesta.

Apache mod_proxy documentazione :

  

Quando agisce in modalità reverse proxy (utilizzando la direttiva ProxyPass, per esempio), mod_proxy_http aggiunge diverse intestazioni di richiesta, al fine di passare informazioni al server di origine. Queste intestazioni sono:

     
      
  • X-Forwarded-For :. L'indirizzo IP del client
  •   
  • X-Forwarded-Host :. L'host originale richiesto dal client nell'intestazione Host richiesta HTTP
  •   
  • X-Forwarded-Server : Il nome host del server proxy
  • .   
     

Fare attenzione quando si utilizzano queste intestazioni sul server di origine, dal momento che contengono più di un valore (separati da virgola) se la richiesta originale conteneva già una di queste intestazioni. Ad esempio, è possibile utilizzare% {X-Forwarded-For} i nella stringa di formato di registro del server di origine per registrare l'indirizzo client IP originale, ma si può ottenere più di un indirizzo se la richiesta passa attraverso diverse deleghe.

Nel vostro servlet, si avrebbe:

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

questo è molto semplice:

<VirtualHost> 

 ServerName www.server.com

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

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

</VirtualHost>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top