1. Home
  2. Lập Trình
  3. Get IP Address Client In Java
Nguyễn Tuấn 10 tháng trước

Get IP Address Client In Java

Get IP Address Client

Để có thể Get IP Address Client bạn cần triển khai một API trong Java (hoặc bất kỳ ngôn ngữ lập trình phù hợp nào) để trả về địa chỉ IP của client. Dưới đây là một ví dụ đơn giản về việc triển khai một API trong Java để trả về địa chỉ IP của client:

Xem thêm nhiều bài viết về Get IP Address

Sử dụng API Get IP Address

Cách 1: Lấy Ip từ HttpServletRequest

import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IPController {

    @GetMapping("/get-client-ip")
    public String getClientIP(HttpServletRequest request) {
        String clientIP = request.getRemoteAddr();
        return "Địa chỉ IP của client: " + clientIP;
    }
}

Trong ví dụ trên, chúng ta sử dụng Spring Boot (một khung làm việc Java phổ biến) để triển khai một API đơn giản có đường dẫn “/get-client-ip” để trả về địa chỉ IP của client. Phương thức getClientIP sử dụng đối tượng HttpServletRequest để lấy địa chỉ IP của client từ yêu cầu HTTP.

Khi triển khai API này trên máy chủ, bạn có thể gọi nó từ ứng dụng ReactJS (hoặc bất kỳ ứng dụng nào khác) để lấy địa chỉ IP của client thông qua một cuộc gọi HTTP.

Cách 2: Sử dụng ipv4.icanhazip.com

Dưới đây là một ví dụ đơn giản sử dụng thư viện java.net.HttpURLConnection trong Java để lấy địa chỉ IP của client từ dịch vụ https://ipv4.icanhazip.com/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class IPUtils {
    public static String getClientIP() throws IOException {
        URL url = new URL("https://ipv4.icanhazip.com/");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
            String ipAddress = reader.readLine().trim();
            return ipAddress;
        }
    }

    public static void main(String[] args) {
        try {
            String clientIP = getClientIP();
            System.out.println("Địa chỉ IP của client: " + clientIP);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Trong ví dụ trên, chúng ta thực hiện một cuộc gọi HTTP đến URL “https://ipv4.icanhazip.com/” và đọc địa chỉ IP được trả về từ nội dung phản hồi của trang web.

Lưu ý rằng việc sử dụng dịch vụ bên ngoài như vậy sẽ tạo một cuộc gọi mạng, do đó, cần xử lý các tình huống ngoại lệ (exception) và cân nhắc về hiệu năng trong ứng dụng của bạn.

Cách 3: Sử dụng HttpServletRequest

import javax.servlet.http.HttpServletRequest;

public class IPUtils {
    public static String getClientIP(HttpServletRequest request) {
        String ipAddress = request.getHeader("X-Forwarded-For");
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("Proxy-Client-IP");
        }
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
        }
        return ipAddress;
    }
}

Cách 4: Sử dụng ServletRequestAttributes (Spring Framework)

import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;

public class IPUtils {
    public static String getClientIP() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        return getClientIP(request);
    }

    private static String getClientIP(HttpServletRequest request) {
        // Tương tự như cách 3
        // ...
    }
}

Cả 3 cách trên sẽ giúp bạn lấy địa chỉ IP của client trong môi trường server-side. Tuy nhiên, hãy lưu ý rằng trong môi trường thực tế, thông tin địa chỉ IP có thể bị ẩn đi bởi các proxy hoặc load balancer. Trong trường hợp này, X-Forwarded-For và các trường header khác trong cách thứ nhất có thể cần được kiểm tra và xử lý đặc biệt để lấy địa chỉ IP chính xác của client.

Cách 5: Get Ip Address Client khi bị ẩn bởi Proxy hoặc load balancer

Để lấy địa chỉ IP chính xác của client trong môi trường có sử dụng proxy hoặc load balancer, cần thực hiện xử lý đặc biệt. Trong trường hợp này, bạn nên kiểm tra các trường header mà proxy hoặc load balancer cung cấp để chứa thông tin về địa chỉ IP của client. Thông thường, địa chỉ IP của client sẽ được chuyển tiếp qua các trường header như X-Forwarded-For, Proxy-Client-IP, WL-Proxy-Client-IP, HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR.

Dưới đây là một cách xử lý để lấy địa chỉ IP chính xác của client trong trường hợp có sử dụng proxy hoặc load balancer:

import javax.servlet.http.HttpServletRequest;

public class IPUtils {
    public static String getClientIP(HttpServletRequest request) {
        String[] headerNames = { "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR" };
        String ipAddress = null;

        for (String header : headerNames) {
            ipAddress = request.getHeader(header);
            if (ipAddress != null && ipAddress.length() != 0 && !"unknown".equalsIgnoreCase(ipAddress)) {
                break;
            }
        }

        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
        }

        return ipAddress;
    }
}

Trong ví dụ trên, chúng ta kiểm tra lần lượt các trường header được đề cập ở trên. Nếu tìm thấy địa chỉ IP không phải là “unknown” và không rỗng, thì chúng ta coi đó là địa chỉ IP chính xác của client. Nếu không, chúng ta sử dụng phương pháp getRemoteAddr() để lấy địa chỉ IP mặc định.

Lưu ý rằng môi trường sử dụng proxy hoặc load balancer có thể có cấu hình khác nhau, do đó, cách xử lý trên có thể cần điều chỉnh tùy thuộc vào cấu hình cụ thể của môi trường bạn đang làm việc.

28 lượt xem | 0 bình luận
Đồng ý Cookie
Trang web này sử dụng Cookie để nâng cao trải nghiệm duyệt web của bạn và cung cấp các đề xuất được cá nhân hóa. Bằng cách chấp nhận để sử dụng trang web của chúng tôi