En JSP, el método para obtener la dirección IP del cliente es: request.getRemoteAddr(). Este método es efectivo en la mayoría de los casos. Sin embargo, la dirección IP real del cliente no se puede obtener mediante software de proxy inverso como Apache y Squid. Si se utiliza software de proxy inverso, la dirección IP obtenida mediante 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 por 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 devolver directamente la dirección de la solicitud reenviada al cliente. Sin embargo, la información X-FORWARDED-FOR se agrega a la información del encabezado HTTP de la solicitud reenviada. 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/, en realidad no es nuestro navegador el que accede al archivo index.jsp en el servidor. En cambio, el servidor proxy accede primero a index.jsp y el servidor proxy nos devuelve los resultados accedidos. Debido a que el servidor proxy accede a index.jsp, la IP obtenida mediante el método request.getRemoteAddr () en index.jsp es en realidad la dirección del servidor proxy, no la dirección IP del cliente.
Entonces podemos idear el método uno para obtener la dirección IP real del cliente:
cadena pública getRemortIP (solicitud HttpServletRequest) {
if (request.getHeader ("x-reenviado-para") == nulo) {
return request.getRemoteAddr();
}
return request.getHeader("x-reenviado-para");
}
Método 2 para obtener la dirección IP real del cliente:
cadena pública getIpAddr (solicitud HttpServletRequest) {
String ip = request.getHeader("x-reenviado-para");
if(ip == nulo || ip.length() == 0 || "desconocido".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Cliente-IP");
}
if(ip == nulo || ip.length() == 0 || "desconocido".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Cliente-IP");
}
if(ip == nulo || ip.length() == 0 || "desconocido".equalsIgnoreCase(ip)) {
ip = solicitud.getRemoteAddr();
}
devolver IP;
}
Sin embargo, si se pasa un proxy inverso de varios niveles, el valor de X-Forwarded-For no es solo uno, sino una serie de valores de IP ¿Cuál es la IP real del cliente real?
La respuesta es tomar la primera cadena IP válida no desconocida en X-Forwarded-For. como:
X-reenviado 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