aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/traccar/helper/IpRetriever.java
blob: ff211d181eff6ff794289bebf751555b3e0ba310 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package org.traccar.helper;

import javax.servlet.http.HttpServletRequest;

/**
 * Gets the client's IP address regardless of whether
 * the server is behind a proxy/reverse proxy server or a load balancer.
 */
public final class IpRetriever {

    /**
     * Retrieves the client's IP address.
     * Handles the cases like whether the server is behind a proxy/reverse proxy server or a load balancer
     *
     * @param request {@link HttpServletRequest} instance
     * @return client's IP address
     */
    public static String retrieveIP(HttpServletRequest request) {

        if (request != null) {
            String ipAddress = request.getHeader("X-FORWARDED-FOR");

            if (ipAddress != null && !ipAddress.isEmpty()) {
                return removeUnwantedData(ipAddress);
            } else {
                ipAddress = request.getRemoteAddr();
                return ipAddress;
            }

        } else {
            return null;
        }

    }

    /**
     * If the server is behind a reverse proxy, the header value will also
     * contain the IP's from load balancer and reverse proxy.
     * This method gets rid of them.
     *
     * @param ipAddress IP address value from the header
     * @return IP address of the client
     */
    private static String removeUnwantedData(String ipAddress) {
        return ipAddress.contains(",") ? ipAddress.split(",")[0] : ipAddress;
    }

    private IpRetriever() {
    }
}