java - obtener - Por qué request.getRemoteAddr() devuelve ipv4 o ipv6 según el contexto(consulta posterior o consulta ajax)
spring boot get ip address of request (3)
La razón es que el nombre que escribe en su navegador tiene direcciones ipv4 e ipv6. El navegador elige usar ipv4, flash elige usar ipv6. No hay nada que pueda hacer al respecto en el lado del servidor (no hay forma de convertir).
Sin embargo, puede cambiar su DNS y hacer que su nombre tenga solo una dirección, ya sea ipv4 o ipv6. También puede conectarse con una dirección IP literal (127.0.0.1), no con un nombre (localhost).
He donne una aplicación web con Spring / GWT que usa Flash para cargar archivos.
Cuando envío una solicitud ajax con GWT e intento obtener la dirección IP del usuario, obtengo una dirección ipv4 como la siguiente: 127.0.0.1
pero cuando cargo mis archivos con flash (y luego una solicitud posterior en la misma aplicación web) obtengo una dirección ipv6 0: 0: 0: 0: 0: 0: 0: 1
Uso el mismo código para obtener la IP del usuario, que es:
ServletRequestAttributes att = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
att.getRequest().getRemoteAddr();
El problema es que utilizo una firma que usa la dirección IP para asegurarme de que el usuario puede cargar archivos (debido a un error con la sesión perdida al cargar con flash) y la dirección IP cambia cuando uso ajax o Publicar vía flash.
¿Cuál es el problema y cómo puedo obtener el mismo formato de IP?
Gracias
Puede solucionarlo iniciando su servidor con esta bandera
-Djava.net.preferIPv4Stack=true
obtienes una dirección IPv6 y luego se usa IPv6. IPv4 e IPv6 son protocolos diferentes, y el cliente elige cuál usar cuando ambos están disponibles.
Si desea la dirección IPv4 del cliente, puede obligarlos a usarla al no anunciar la dirección IPv6 en DNS. Sin embargo, eso sería una mala idea con el despliegue creciente de IPv6. El soporte de ambos es bueno, por lo que es mejor tratar con clientes que usan IPv6.