En teoría, lo siguiente debería ser suficiente.
if (request.getRemoteAddr().equals(request.getLocalAddr())) {
// Locally accessed.
} else {
// Remotely accessed.
}
actualización según los comentarios, request.getLocalAddr()
parece volver 0.0.0.0
que puede suceder de hecho cuando el servidor está detrás de un proxy.
En su lugar, puede querer compararlo con las direcciones resueltas por InetAddress
.
private Set<String> localAddresses = new HashSet<String>();
@Override
public void init(FilterConfig config) throws ServletException {
try {
localAddresses.add(InetAddress.getLocalHost().getHostAddress());
for (InetAddress inetAddress : InetAddress.getAllByName("localhost")) {
localAddresses.add(inetAddress.getHostAddress());
}
} catch (IOException e) {
throw new ServletException("Unable to lookup local addresses");
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
if (localAddresses.contains(request.getRemoteAddr())) {
// Locally accessed.
} else {
// Remotely accessed.
}
}
En mi caso, el localAddresses
contiene lo siguiente:
[192.168.1.101, 0:0:0:0:0:0:0:1, 127.0.0.1]
¿No podríamos tener el caso de que la IP del cliente es localhost y el servidor es otro, p. la IP pública? – Cratylus
Entonces solo hay medios de acceso remoto. ¿O no es eso lo que estás preguntando? – BalusC
Parece que esto no es correcto. El 'request.getLocalAddr()' siempre devuelve '0.0.0.0' – Cratylus