En JSP, el método para obtener la dirección IP del cliente es: request.getRemoteaddr (), que es válido en la mayoría de los casos. Sin embargo, después de pasar Apache, Squid y otro software de proxy inverso, no puede obtener la dirección IP real del cliente. Si se usa el software de proxy inverso, la dirección IP obtenida utilizando el método request.getRemoteaddr () es: 127.0.0.1 o 192.168.1.110, no la IP real del cliente.
Después de pasar el proxy, dado que se agrega una capa intermedia entre el cliente y el servicio, el servidor no puede obtener directamente la IP del cliente, y la aplicación del lado del servidor no puede volver directamente al cliente a través de la dirección de reenvío. Sin embargo, en la información del encabezado HTTP de reenviar la solicitud, se agrega información X-Forwarded para la información. Se utiliza para rastrear la dirección IP del cliente original y la dirección del servidor solicitada por el cliente original. Cuando accedemos a index.jsp/, no es que nuestro navegador realmente acceda al archivo index.jsp en el servidor. En su lugar, el servidor proxy primero accede a index.jsp, y el servidor proxy devuelve el resultado accedido a nuestro navegador. Debido a que el servidor proxy accede a index.jsp, la IP obtenida por el método request.getRemoteAddr () en index.jsp es en realidad la dirección del servidor proxy, no la dirección IP del cliente.
Por lo tanto, se puede obtener un método para obtener la dirección IP real del cliente:
public String getRemortip (httpservletrequest request) {if (request.getheader ("x-forwarded-for") == null) {return request.getRemoteaddr (); } return request.getheader ("X-Forwarded-For"); }Método 2 para obtener la dirección IP real del cliente:
Public String getIpaddr (httpservletrequest request) {String ip = request.getheader ("x-forwarded-for"); if (ip == null || ip.length () == 0 || "desconocido" .equalSignorecase (ip)) {ip = request.getheader ("proxy-client-ip"); } if (ip == null || ip.length () == 0 || "desconocido" .equalSignorecase (ip)) {ip = request.getheader ("wl-proxy-client-ip"); } if (ip == null || ip.length () == 0 || "desconocido" .equalSignorecase (ip)) {ip = request.getRemoteaddr (); } return ip; }Sin embargo, si se pasa un proxy inverso de nivel múltiple, hay más de un valor de X-Forwarded-For, pero una serie de valores IP. ¿Cuál es la IP real del lado real del usuario?
La respuesta es tomar la primera cadena IP válida no desconocida en X-Forwarded-For. como:
X-Forwarded-para: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
La IP real del usuario es: 192.168.1.110