Persekitaran: jdk1.8 + idea2019.3 + Windows10
Semasa pembangunan projek, apabila berurusan dengan log operasi setiap hari, rakaman log operasi pengguna pada asasnya dicapai melalui aspek AOP Walau bagaimanapun, apabila ia datang untuk merekodkan log operasi, mesti ada satu item yang secara asasnya dirujuk dan direkodkan, dan itu ialah pengendali Alamat IP pelanggan juga mudah untuk menyemak "kotor" pada masa hadapan.
Kemudian soalan datang. Bagaimanakah anda mendapatkan alamat IP pelanggan secara khusus? Hahaha, inilah kandungan pengajaran saya dalam isu ini Jika ada kawan-kawan yang tahu cara mendapatkannya, maka saya ingin memuji anda, tetapi adakah idea pelaksanaannya berbeza dengan saya? Jadi anda juga boleh cuba melihat bagaimana bakteria pepijat dilaksanakan.
Seterusnya, saya akan mula mengajar, anda perlu mendengar dengan teliti.
Langkah 1: Mula-mula mari kita tentukan kelas alat yang khusus digunakan untuk merangkum kelas kaedah berkaitan ip.
package com.example.review.util; import org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletRequest; /** * ip相关工具类 * * @Author luoYong * @Date 2022-03-30 17:16 */ public class IpUtils { }
Langkah 2: Ini adalah teras tutorial ini, jadi bagaimana anda mendapatkan IP klien? Saya tidak akan menjualnya lagi.
Biasanya alamat IP pelanggan diperoleh melalui request.getRemoteAddr() , betul, tetapi pernahkah anda memikirkannya pada masa kini, sistem asas akan melaksanakan proksi nama domain, seperti melalui Apache , Untuk perisian proksi terbalik seperti Squid, tidak lagi mungkin untuk mendapatkan alamat IP sebenar pelanggan menggunakan getRemoteAddr().
Mengapa saya tidak boleh mendapatkannya selepas menambah ejen? Ini kerana proksi perantaraan ditambah antara klien dan perkhidmatan, jadi pelayan tidak boleh mendapatkan alamat IP klien secara langsung, dan aplikasi sebelah pelayan tidak boleh terus mengembalikan alamat permintaan kepada klien dengan memajukannya kaedah mendapatkan secara langsung Telah diluluskan.
Jika anda masih tidak faham, anda boleh lihat gambarajah proses agensi di bawah dan anda akan faham.
Jika anda hanya mengehadkan sistem tanpa proksi, maka sudah tentu ia ok. Pada asasnya adalah mustahil untuk sistem tidak bertindak sebagai ejen, jadi apa yang perlu kita lakukan? Jangan risau, saya akan beritahu anda cara bermain Jika anda masih tidak boleh mendapatkannya selepas menggunakan kaedah pengajaran saya, sila datang dan pukul saya, okay?
Berikut ialah kelas kaedah khusus untuk mendapatkan IP klien: untuk rujukan anda sahaja.
/*** * 获取客户端ip地址 * @param request */ public static String getIP(final HttpServletRequest request) throws Exception { if (request == null) { throw (new Exception("getIpAddr method HttpServletRequest Object is null")); } String ipStr = request.getHeader("x-forwarded-for"); if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isBlank(ipStr) || "unknown".equalsIgnoreCase(ipStr)) { ipStr = request.getRemoteAddr(); } // 多个路由时,取第一个非unknown的ip final String[] arr = ipStr.split(","); for (final String str : arr) { if (!"unknown".equalsIgnoreCase(str)) { ipStr = str; break; } } //目的是将localhost访问对应的ip 0:0:0:0:0:0:0:1 转成 127.0.0.1。 return ipStr.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipStr; }
Perlu diingatkan bahawa apabila membangunkan secara tempatan, anda pada asasnya menggunakan nama hos standard [localhost] untuk akses antara muka, bukan? , beberapa IP ternyata 0:0:0:0:0:0:0:1.
Kenapa IP diperolehi begini? Ini kerana 0:0:0:0:0:0:0:1 ialah perwakilan [ipv6], yang bersamaan dengan 127.0.0.1 untuk [ipv4], iaitu mesin tempatan. Jadi pada akhirnya, saya secara paksa menukar alamat ipv6 kepada alamat ipv4 melalui aritmetik trinokular. Bolehkah semua orang memahami ini? Jika anda tidak faham, tidak mustahil untuk kembali dan bermain-main dengan rangkaian komputer.
Berikut ialah rekod log operasi yang disimpan dalam pangkalan data untuk capaian antara muka melalui localhost dan IP sebenar masing-masing.
Dilampirkan tangkapan skrin pangkalan data IP tempatan:
Atas ialah kandungan terperinci Bagaimana untuk mendapatkan alamat IP pelanggan di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!