Jadual Kandungan
Pengenalan:
Pembangunan:
Analisis dalam talian:
Senario:
Rumah Java javaTutorial Bagaimana Spring Boot cepat melaksanakan resolusi alamat IP

Bagaimana Spring Boot cepat melaksanakan resolusi alamat IP

May 10, 2023 pm 03:04 PM
alamat IP springboot

Pengenalan:

Jika anda menggunakan resolusi IP tempatan, kami akan menggunakan ip2region Projek ini mengekalkan jadual surat-menyurat alamat IP tempatan yang lebih terperinci. Jika anda ingin menggunakannya dalam persekitaran luar talian, anda perlu mengimport projek ini Bergantung pada, dan nyatakan versi, kaedah versi berbeza mungkin berbeza.

<!--    ip库-->
<dependency>
	<groupId>org.lionsoul</groupId>
	<artifactId>ip2region</artifactId>
	<version>2.6.3</version>
        </dependency>
Salin selepas log masuk

Pembangunan:

Anda perlu memuat turun fail xdb ke direktori fail projek semasa menggunakannya Walaupun anda menggunakan ip2region untuk membuat pertanyaan sepenuhnya berdasarkan fail xdb, masa tindak balas a pertanyaan tunggal berada pada tahap sepuluh mikrosaat , pertanyaan dipercepatkan memori boleh didayakan dalam dua cara berikut:

  • cache indeks vIndex: Gunakan ruang memori 512KiB tetap untuk menyimpan data indeks vektor. , mengurangkan satu operasi cakera IO, dan mengekalkan kecekapan pertanyaan purata Stabil antara 10-20 mikrosaat.

  • xdb keseluruhan cache fail: Muatkan keseluruhan fail xdb ke dalam memori, penggunaan memori adalah sama dengan saiz fail xdb, tiada operasi cakera IO dan kecekapan pertanyaan peringkat mikrosaat dikekalkan.

/**
 * ip查询
 */
@Slf4j
public class IPUtil {
    private static final String UNKNOWN = "unknown";
    protected IPUtil(){ }
    /**
     * 获取 IP地址
     * 使用 Nginx等反向代理软件, 则不能通过 request.getRemoteAddr()获取 IP地址
     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,
     * X-Forwarded-For中第一个非 unknown的有效IP字符串,则为真实IP地址
     */
    public static String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
    }
    public static  String getAddr(String ip){
        String dbPath = "src/main/resources/ip2region/ip2region.xdb";
        // 1、从 dbPath 加载整个 xdb 到内存。
        byte[] cBuff;
        try {
            cBuff = Searcher.loadContentFromFile(dbPath);
        } catch (Exception e) {
            log.info("failed to load content from `%s`: %s\n", dbPath, e);
            return null;
        }
        // 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。
        Searcher searcher;
        try {
            searcher = Searcher.newWithBuffer(cBuff);
        } catch (Exception e) {
           log.info("failed to create content cached searcher: %s\n", e);
            return null;
        }
        // 3、查询
        try {
            String region = searcher.searchByStr(ip);
            return region;
        } catch (Exception e) {
            log.info("failed to search(%s): %s\n", ip, e);
        }
        return null;
    }
Salin selepas log masuk

Di sini kami merangkumkan resolusi ip ke dalam kelas alat, termasuk dua kaedah untuk mendapatkan resolusi IP dan alamat ip. Resolusi ip boleh diperolehi dalam permintaan. Selepas memperoleh IP, anda perlu mencari resolusi alamat IP yang sepadan dalam xdb berdasarkan IP Memandangkan pangkalan data tempatan mungkin mempunyai kekurangan tertentu, sesetengah IP tidak dapat diselesaikan.

Analisis dalam talian:

Jika anda ingin mendapatkan maklumat alamat IP yang lebih komprehensif, anda boleh menggunakan pangkalan data dalam talian Apa yang disediakan di sini ialah analisis IP whois.pconline.com analisis ada dalam saya Prestasi sangat lancar semasa penggunaan, dan hanya beberapa IP tidak dapat diselesaikan.

@Slf4j
public class AddressUtils {
    // IP地址查询
    public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";

    // 未知地址
    public static final String UNKNOWN = "XX XX";

    public static String getRealAddressByIP(String ip) {
        String address = UNKNOWN;
        // 内网不查询
        if (IpUtils.internalIp(ip)) {
            return "内网IP";
        }
        if (true) {
            try {
                String rspStr = sendGet(IP_URL, "ip=" + ip + "&json=true" ,"GBK");
                if (StrUtil.isEmpty(rspStr)) {
                    log.error("获取地理位置异常 {}" , ip);
                    return UNKNOWN;
                }
                JSONObject obj = JSONObject.parseObject(rspStr);
                String region = obj.getString("pro");
                String city = obj.getString("city");
                return String.format("%s %s" , region, city);
            } catch (Exception e) {
                log.error("获取地理位置异常 {}" , ip);
            }
        }
        return address;
    }
    public static String sendGet(String url, String param, String contentType) {
        StringBuilder result = new StringBuilder();
        BufferedReader in = null;
        try {
            String urlNameString = url + "?" + param;
            log.info("sendGet - {}" , urlNameString);
            URL realUrl = new URL(urlNameString);
            URLConnection connection = realUrl.openConnection();
            connection.setRequestProperty("accept" , "*/*");
            connection.setRequestProperty("connection" , "Keep-Alive");
            connection.setRequestProperty("user-agent" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.connect();
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            log.info("recv - {}" , result);
        } catch (ConnectException e) {
            log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);
        } catch (SocketTimeoutException e) {
            log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);
        } catch (IOException e) {
            log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);
        } catch (Exception e) {
            log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception ex) {
                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
            }
        }
        return result.toString();
    }
}
Salin selepas log masuk

Senario:

Jadi dalam proses pembangunan apakah yang lebih sesuai untuk mendapatkan alamat IP kami akan digunakan di sini? Minta setiap permintaan yang memasuki perkhidmatan, lakukan pra-operasi dan lengkapkan penghuraian pengepala permintaan, pemerolehan IP dan resolusi alamat IP apabila masuk, supaya alamat IP dan maklumat lain boleh digunakan semula dalam semua proses berikutnya.

/**
 * 对ip 进行限制,防止IP大量请求
 */
@Slf4j
@Configuration
public class IpUrlLimitInterceptor implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) {

        //更新全局变量
        Constant.IP = IPUtil.getIpAddr(httpServletRequest);
        Constant.IP_ADDR = AddressUtils.getRealAddressByIP(Constant.IP);
        Constant.URL = httpServletRequest.getRequestURI();
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) {
        //通过本地获取
//        获得ip
//        String ip = IPUtil.getIpAddr(httpServletRequest);
        //解析具体地址
//        String addr = IPUtil.getAddr(ip);

        //通过在线库获取
//        String ip = IpUtils.getIpAddr(httpServletRequest);
//        String ipaddr = AddressUtils.getRealAddressByIP(ipAddr);
//        log.info("IP >> {},Address >> {}",ip,ipaddr);
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {

    }
}
Salin selepas log masuk
如果想要执行我们的ip 解析拦截器,需要在spring boot的视图层进行拦截才会触发我们的拦截器。
Salin selepas log masuk
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    IpUrlLimitInterceptor ipUrlLimitInterceptor;
	
	    //执行ip拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(ipUrlLimitInterceptor)
                // 拦截所有请求
                .addPathPatterns("/**");
    }
}
Salin selepas log masuk
通过这样的一套流程下来,我们就能实现对每一个请求进行ip 获取、ip解析,为每个请求带上具体ip地址的小尾巴。
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana Spring Boot cepat melaksanakan resolusi alamat IP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menetapkan Xiaohongshu supaya tidak memaparkan alamat IP? Bagaimanakah ia menukar id untuk mencari bandar? Bagaimana untuk menetapkan Xiaohongshu supaya tidak memaparkan alamat IP? Bagaimanakah ia menukar id untuk mencari bandar? Mar 27, 2024 pm 03:00 PM

Xiaohongshu ialah platform e-dagang sosial yang popular di mana pengguna boleh berkongsi kehidupan harian mereka dan menemui produk kegemaran mereka. Sesetengah pengguna lebih sensitif terhadap privasi peribadi dan berharap alamat IP mereka tidak akan dipaparkan pada Xiaohongshu untuk melindungi privasi dalam talian mereka. Jadi, bagaimana untuk menetapkan Xiaohongshu supaya tidak memaparkan alamat IP? Artikel ini akan menjawab soalan ini secara terperinci. 1. Bagaimana untuk menetapkan Xiaohongshu supaya tidak memaparkan alamat IP? 1. Ubah suai tetapan Xiaohongshu: Buka APP Xiaohongshu, klik "Saya" di penjuru kanan sebelah bawah untuk memasuki pusat peribadi. Kemudian klik pada avatar untuk memasukkan tetapan akaun. Dalam tetapan akaun, cari "Tetapan Privasi" dan klik untuk masuk. Di sini, anda boleh mencari pilihan tetapan untuk alamat IP, matikan sahaja. 2. Kosongkan cache: Kadangkala, Xiaohongshu mungkin memaparkan ralat

Bagaimana untuk menyelesaikan masalah bahawa alamat IP Windows 10 tidak boleh disimpan selepas menetapkannya Bagaimana untuk menyelesaikan masalah bahawa alamat IP Windows 10 tidak boleh disimpan selepas menetapkannya Jul 08, 2023 pm 12:33 PM

Kadang-kadang semua orang menghadapi keperluan untuk mengubah suai alamat IP secara manual, tetapi sesetengah pelanggan Windows 10 melaporkan bahawa alamat IP tidak boleh disimpan selepas menetapkannya Bagaimana untuk menyelesaikan situasi ini? Alamat IP disimpan pada asasnya kerana terdapat ralat dalam mengisi alamat IP anda Anda boleh menyemak sama ada awalan subnet telah ditulis dengan subnet mask Jika ya, tukarkannya semula. alamat IP. Bagaimana untuk menyelesaikan masalah bahawa alamat IP Windows 10 tidak boleh disimpan selepas ia ditetapkan: Gambar ralat adalah seperti berikut: Gesaan "Tidak dapat menyimpan tetapan IP, sila semak satu atau lebih tetapan dan cuba" disebabkan oleh mengisi ralat ini ialah panjang awalan subnet, bukan topeng subnet Seperti yang ditunjukkan dalam gambar. Seperti yang ditunjukkan dalam gambar di atas, ramai pengguna sebenarnya menulis awalan subnet sebagai topeng subnet.

Di manakah alamat IP telefon bimbit Xiaomi? Di manakah alamat IP telefon bimbit Xiaomi? Feb 29, 2024 pm 06:10 PM

Di manakah alamat IP telefon bimbit Xiaomi? Anda boleh menyemak alamat IP pada telefon bimbit Xiaomi, tetapi kebanyakan pengguna tidak tahu di mana untuk menyemak alamat IP Seterusnya ialah tutorial grafik tentang cara menyemak alamat IP telefon bimbit Xiaomi telefon yang dibawa oleh editor. Pengguna yang berminat datang dan lihat! Di manakah alamat IP telefon bimbit Xiaomi? . Kemudian pada halaman Semua Parameter , slaid ke bawah dan pilih [Maklumat Status] 4. Akhir sekali, anda boleh melihat alamat IP dalam antara muka maklumat status.

Di mana untuk menukar alamat IP Xianyu_Share cara menukar alamat IP Xianyu Di mana untuk menukar alamat IP Xianyu_Share cara menukar alamat IP Xianyu Mar 20, 2024 pm 05:06 PM

Xianyu ialah platform dagangan terpakai yang sangat praktikal Di sini kita boleh membeli pelbagai produk dan menjual barangan terbiar kita sendiri. Bagaimana jika kita ingin mengubah suai alamat kita. Mari lihat dengan editor di bawah! Kongsi cara mengubah suai alamat IP Xianyu Pertama, buka perisian Xianyu Selepas memasuki laman utama, anda boleh melihat pasaran makanan laut, cadangan, alamat dan pilihan lain di sudut kiri atas. 2. Kemudian pada halaman alamat, kami klik [Anak Panah Bawah] di sebelah alamat 3. Selepas klik terakhir, kami klik pada bandar pada halaman pemilihan bandar;

Bagaimana untuk menukar lokasi alamat IP Douyin? Mengapa alamat IP bertukar lokasi? Bagaimana untuk menukar lokasi alamat IP Douyin? Mengapa alamat IP bertukar lokasi? Mar 21, 2024 pm 06:30 PM

Pengguna berkongsi kehidupan mereka, menunjukkan bakat mereka, dan berinteraksi dengan netizen di seluruh negara dan juga dunia melalui Douyin. Sesetengah pengguna ingin menukar alamat IP mereka di Douyin atas sebab seperti perlindungan privasi atau sekatan geografi. Jadi, bagaimanakah alamat IP Douyin menukar lokasinya? 1. Bagaimana untuk menukar lokasi alamat IP Douyin? Pelayan proksi ialah perkhidmatan perantara yang digunakan untuk memajukan permintaan pengguna ke Internet dan mengembalikan respons. Dengan mengkonfigurasi pelayan proksi, pengguna boleh menyembunyikan alamat IP sebenar mereka dan menukar alamat IP mereka. Pendekatan ini membantu melindungi privasi pengguna dan meningkatkan keselamatan rangkaian. Pelayan proksi juga boleh digunakan untuk mengakses kandungan terhad atau memintas sekatan geolokasi. Secara umumnya, menggunakan pelayan proksi ialah alat rangkaian praktikal yang boleh membantu pengguna melayari Internet dengan lebih selamat dan bebas.

Bagaimana untuk menyelesaikan masalah bahawa springboot tidak boleh mengakses fail selepas membacanya ke dalam pakej balang Bagaimana untuk menyelesaikan masalah bahawa springboot tidak boleh mengakses fail selepas membacanya ke dalam pakej balang Jun 03, 2023 pm 04:38 PM

Springboot membaca fail, tetapi tidak boleh mengakses perkembangan terkini selepas membungkusnya ke dalam pakej balang Terdapat situasi di mana springboot tidak boleh membaca fail selepas membungkusnya ke dalam pakej balang adalah tidak sah dan hanya boleh diakses melalui strim. Fail berada di bawah resources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

PHP melaksanakan fungsi pertanyaan alamat IP PHP melaksanakan fungsi pertanyaan alamat IP Jun 22, 2023 pm 11:22 PM

Dengan perkembangan pesat Internet, alamat IP telah menjadi bahagian penting dalam komunikasi rangkaian. Maklumat alamat IP sangat penting dalam pemantauan keselamatan rangkaian, pengurusan trafik dan pengiklanan e-dagang yang disasarkan. Oleh itu, untuk memudahkan pengguna menanyakan maklumat alamat IP/nama domain, banyak laman web menyediakan fungsi pertanyaan alamat IP. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melaksanakan fungsi pertanyaan alamat IP untuk rujukan pembaca. 1. Apakah alamat IP? Alamat IP (InternetProtocolAddress) ialah protokol rangkaian

Alamat IP transaksi Bitcoin (Adakah alamat IP transaksi Bitcoin awam?) Alamat IP transaksi Bitcoin (Adakah alamat IP transaksi Bitcoin awam?) Feb 06, 2024 am 10:03 AM

Alamat IP transaksi Bitcoin Alamat IP transaksi Bitcoin adalah komponen penting dan penting dalam sistem transaksi Bitcoin. Ia adalah teras platform dagangan Bitcoin di mana pedagang Bitcoin boleh menjalankan transaksi Bitcoin. Alamat IP transaksi Bitcoin adalah asas sistem transaksi Bitcoin dan asas di mana pedagang Bitcoin boleh menjalankan transaksi Bitcoin. Alamat IP perdagangan Bitcoin ialah alamat rangkaian global yang digunakan untuk mencari pelayan sistem perdagangan Bitcoin dan peranti pedagang. Dengan menanyakan alamat IP transaksi Bitcoin, anda boleh mendapatkan status transaksi dan maklumat berkaitan. Selain itu, alamat IP perdagangan Bitcoin juga boleh digunakan untuk menghubungkan pelanggan kepada sistem perdagangan Bitcoin dan peranti pedagang. Adakah alamat IP transaksi Bitcoin awam? Alamat IP transaksi Bitcoin tidak akan didedahkan kepada umum

See all articles