Comment obtenir l’adresse IP du client en Java

Comment obtenir l'adresse IP du client en Java

En Java, vous pouvez utiliserHttpServletRequest.getRemoteAddr() pour obtenir l’adresse IP du client qui accède à votre application Web Java.

import javax.servlet.http.HttpServletRequest;

String ipAddress = request.getRemoteAddr();

1. Serveur proxy ou Cloudflare

Pour une application Web qui se trouve derrière un serveur proxy, un équilibreur de charge ou la solution populaireCloudflare, vous devez obtenir l'adresse IP du client via l'en-tête de requête HTTPX-Forwarded-For (XFF).

import javax.servlet.http.HttpServletRequest;

    //...

    private static String getClientIp(HttpServletRequest request) {

        String remoteAddr = "";

        if (request != null) {
            remoteAddr = request.getHeader("X-FORWARDED-FOR");
            if (remoteAddr == null || "".equals(remoteAddr)) {
                remoteAddr = request.getRemoteAddr();
            }
        }

        return remoteAddr;
    }

2. Vous ne travaillez toujours pas?

Vérifiez l'en-tête de demande HTTP du client et essayez d'identifier l'emplacement de stockage de l'adresse IP.

    private Map getRequestHeadersInMap(HttpServletRequest request) {

        Map result = new HashMap<>();

        Enumeration headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String key = (String) headerNames.nextElement();
            String value = request.getHeader(key);
            result.put(key, value);
        }

        return result;
    }

Exemples d'en-têtes de demande pour une application Web derrière Cloudflare.

    "referer" :"https://www.google.com/",
    "cf-ipcountry" :"US",
    "cf-ray" :"348c7acba8a02210-EWR",
    "x-forwarded-proto" :"https",
    "accept-language" :"en-US,en;q=0.8",
    "cookie" :"__cfduid=d3c6e5d73aa55b6b42fad9600c94849851490726068; _ga=GA1.2.450731937.1490726069",

    "x-forwarded-for" :"100.8.204.40",             // <------ This is client real IP

    "accept" :"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",

    "x-real-ip" :"108.162.219.236",             // <------ This is cloudflare IP

    "x-forwarded-server" :"hostingcompass.com",
    "x-forwarded-host" :"hostingcompass.com",
     "cf-visitor" :"{\"scheme\":\"https\"}",
    "host" :"127.0.0.1:8080",
    "upgrade-insecure-requests" :"1",
    "connection" :"close",
    "cf-connecting-ip" :"100.8.204.40",
    "accept-encoding" :"gzip",
    "user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

Note
Normalement, avant que le serveur Web / proxy ne transfère la requête au serveur d'application Java, il stockera la requête IP du client réel dans un nom d'en-tête standard commex-forwarded-for, si vous le pouvez ne trouvez pas l'adresse IP du client dans tous les en-têtes de la requête, essayez d'en discuter avec votre administrateur de serveur.