Di JSP, metode untuk mendapatkan alamat IP klien adalah: request.getRemoteAddr(). Metode ini efektif dalam banyak kasus. Namun, alamat IP klien yang sebenarnya tidak dapat diperoleh melalui perangkat lunak reverse proxy seperti Apache dan Squid. Jika perangkat lunak proxy terbalik digunakan, alamat IP yang diperoleh menggunakan metode request.getRemoteAddr() adalah: 127.0.0.1 atau 192.168.1.110, bukan IP klien yang sebenarnya.
Setelah melalui proxy, karena lapisan perantara ditambahkan antara klien dan layanan, server tidak dapat secara langsung memperoleh IP klien, dan aplikasi sisi server tidak dapat secara langsung mengembalikan alamat permintaan yang diteruskan ke klien. Namun, informasi X-FORWARDED-FOR ditambahkan ke informasi header HTTP dari permintaan yang diteruskan. Digunakan untuk melacak alamat IP klien asli dan alamat server yang diminta oleh klien asli. Saat kita mengakses index.jsp/, sebenarnya bukan browser kita yang sebenarnya mengakses file index.jsp di server, melainkan server proxy terlebih dahulu mengakses index.jsp, dan server proxy mengembalikan hasil yang diakses ke Browser kita. karena server proxy mengakses index.jsp, maka IP yang diperoleh melalui metode request.getRemoteAddr() di index.jsp sebenarnya adalah alamat server proxy, bukan alamat IP klien.
Jadi kita dapat menemukan metode pertama untuk mendapatkan alamat IP klien yang sebenarnya:
string publik getRemortIP(permintaan HttpServletRequest) {
if (request.getHeader("x-forwarded-for") == null) {
kembalikan permintaan.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
Metode 2 untuk mendapatkan alamat IP klien yang sebenarnya:
String publik getIpAddr(permintaan HttpServletRequest) {
String ip = permintaan.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "tidak diketahui".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Klien-IP");
}
if(ip == null || ip.length() == 0 || "tidak diketahui".equalsIgnoreCase(ip)) {
ip = permintaan.getHeader("WL-Proxy-Klien-IP");
}
if(ip == null || ip.length() == 0 || "tidak diketahui".equalsIgnoreCase(ip)) {
ip = permintaan.getRemoteAddr();
}
kembalikan IP;
}
Namun, jika proxy terbalik multi-level dilewatkan, nilai X-Forwarded-For tidak hanya satu, tetapi serangkaian nilai IP. Yang mana yang merupakan IP sebenarnya dari klien sebenarnya?
Jawabannya adalah dengan mengambil string IP valid pertama yang tidak diketahui di X-Forwarded-For. menyukai:
X-Diteruskan-Untuk: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
IP asli pengguna adalah: 192.168.1.110