Si se usa el software de proxy inverso, al poder inverso la url de http://192.168.1.110:2046/ a la URL de http://www.xxx.com/, use el método request.getRemoteaddr () para obtener la IP para obtener la IP para obtener la IP para obtener la IP para obtener Dirección 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 http://www.xxx.com/index.jsp/, en realidad no es nuestro navegador el que realmente accede al archivo index.jsp en el servidor, pero el servidor proxy primero accede a http: //192.168. 2046/index.jsp, el servidor proxy devuelve el resultado accedido a nuestro navegador. El servidor proxy, no la dirección IP del cliente.
Luego, se puede obtener un método para obtener la dirección IP real del cliente:
La copia del código es la siguiente:
Public String getRemortip (httpservletRequest solicitud) {
if (request.getheader ("x-forwarded-for") == null) {
return request.getRemoteAddr ();
}
return request.getheader ("X-Forwarded-For");
}
Pero cuando visito http://www.xxx.com/index.jsp/, la dirección IP devuelta siempre es desconocida, no 127.0.0.1 o 192.168.1.110 como se muestra arriba, y visito http: // cuando /192.168. 1.110: 2046/index.jsp, se puede devolver la dirección IP real del cliente y se escribe un método para verificar. La razón se encuentra en los calamares. El elemento de reenvío en el archivo de configuración squid.conf reenviado_FOR está por defecto.
Por lo tanto, se puede obtener el segundo método para obtener la dirección IP real del cliente:
La copia del código es la siguiente:
Public String getIpaddr (httpservletrequest solicitud) {
Cadena 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 ();
}
devolver IP;
}
Sin embargo, si se pasa un proxy inverso de nivel múltiple, hay más de un valor de X-Forward-For, pero una cadena de valores IP.
La respuesta es tomar la primera cadena IP válida no desconocida en X-Forwarded-For.
como:
La copia del código es la siguiente:
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