目次
はじめに:
開発:
オンライン分析:
シナリオ:
ホームページ Java &#&チュートリアル Spring Boot が IP アドレス解決を迅速に実装する方法

Spring Boot が IP アドレス解決を迅速に実装する方法

May 10, 2023 pm 03:04 PM
IPアドレス springboot

はじめに:

ローカル IP 解決を使用する場合は、ip2region を使用します。このプロジェクトでは、より詳細なローカル IP アドレス対応表が維持されています。オフライン環境で使用したい場合は、インポートする必要がありますこのプロジェクトのバージョンに応じて、指定方法が異なる場合があります。

<!--    ip库-->
<dependency>
	<groupId>org.lionsoul</groupId>
	<artifactId>ip2region</artifactId>
	<version>2.6.3</version>
        </dependency>
ログイン後にコピー

開発:

xdb ファイルを使用する場合は、プロジェクト ファイル ディレクトリにダウンロードする必要があります。ip2region を使用して完全に xdb ファイルに基づいてクエリを実行したとしても、単一クエリは 10 マイクロ秒のレベルです。メモリ アクセラレーション クエリは次の 2 つの方法で有効にできます:

  • vインデックス インデックス キャッシュ: ベクトル インデックス データをキャッシュするために固定の 512KiB メモリ空間を使用します。 、1 つの IO ディスク操作を削減し、平均クエリ効率を維持します。10 ~ 20 マイクロ秒の間で安定しています。

  • xdb 全体ファイル キャッシュ: xdb ファイル全体をメモリにロードします。メモリ使用量は xdb ファイルのサイズと同じです。ディスク IO 操作はなく、マイクロ秒レベルのクエリ効率はありません。維持されています。

/**
 * 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;
    }
ログイン後にコピー

ここでは、IP 解決と IP アドレス解決を取得する 2 つのメソッドを含む、IP 解決をツール クラスにカプセル化します。IP 解決はリクエストで取得できます。 IP を取得した後、その IP に基づいて xdb で対応する IP アドレスの解決を見つける必要があります。ローカル データベースには特定の欠陥がある可能性があるため、一部の IP は解決できません。

オンライン分析:

より包括的な IP アドレス情報を取得したい場合は、オンライン データベースを使用できます。ここで提供されるのは、whois.pconline.com の IP 分析です。分析は私の中にあります。使用中のパフォーマンスは非常にスムーズで、解決できない IP はほんのわずかです。

@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();
    }
}
ログイン後にコピー

シナリオ:

それでは、開発のどのプロセスで IP アドレスを取得するのがより適切なのでしょうか? ここではインターセプターを使用します。サービスに入るすべてのリクエストをインターセプトし、事前操作を実行し、サービスに入るときにリクエスト ヘッダーの解析、IP 取得、IP アドレス解決を完了します。これにより、IP アドレスとその他の情報が後続のすべてのプロセスで再利用できるようになります。

あーるーるーるーるーるー

以上がSpring Boot が IP アドレス解決を迅速に実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

小紅書がIPアドレスを表示しないように設定するにはどうすればよいですか?都市を見つけるためにIDをどのように変更しますか? 小紅書がIPアドレスを表示しないように設定するにはどうすればよいですか?都市を見つけるためにIDをどのように変更しますか? Mar 27, 2024 pm 03:00 PM

Xiaohonshu は、ユーザーが日常生活を共有したり、お気に入りの商品を見つけたりできる人気のソーシャル e コマース プラットフォームです。一部のユーザーは個人のプライバシーに敏感であり、オンライン プライバシーを保護するために自分の IP アドレスが小紅書に表示されないことを望んでいます。では、Xiaohongshu に IP アドレスが表示されないように設定するにはどうすればよいでしょうか?この記事ではこの質問に詳しく答えます。 1.XiaohongshuにIPアドレスが表示されないように設定するにはどうすればよいですか? 1.小紅書設定を変更します。小紅書アプリを開き、右下隅の「自分」をクリックしてパーソナルセンターに入ります。次に、アバターをクリックしてアカウント設定を入力します。アカウント設定で、「プライバシー設定」を見つけてクリックして入力します。ここで、IP アドレスの設定オプションが表示されます。これをオフにするだけです。 2. キャッシュのクリア:Xiaohongshu がエラーを表示する場合があります。

Windows10のIPアドレスを設定しても保存できない問題の解決方法 Windows10のIPアドレスを設定しても保存できない問題の解決方法 Jul 08, 2023 pm 12:33 PM

場合によっては、IP アドレスを手動で変更する必要がある場合がありますが、一部の Windows 10 ユーザーは、IP アドレスを設定した後に保存できないと報告しています。この状況を解決するにはどうすればよいですか?基本的にIPアドレスの入力ミスによりIPアドレスが保存されます。サブネットプレフィックスがサブネットマスクとともに書き込まれているか確認できます。そうであれば元に戻してください。変更後は正常に保存できます。 IPアドレス。 Windows 10 の IP アドレスを設定した後に保存できない問題を解決する方法: エラー画像は次のとおりです。エラー。図に示すように、これはサブネット マスクではなく、サブネット プレフィックス長です。上の図に示すように、多くのユーザーは実際にサブネット プレフィックスをサブネット マスクとして書き込みます。

Xiaomi 携帯電話の IP アドレスはどこですか? Xiaomi 携帯電話の IP アドレスはどこですか? Feb 29, 2024 pm 06:10 PM

Xiaomi 携帯電話の IP アドレスはどこですか? Xiaomi 携帯電話で IP アドレスを確認できますが、ほとんどのユーザーは IP アドレスを確認する場所がわかりません。次は、Xiaomi 携帯電話の IP アドレスを確認する方法に関するグラフィックチュートリアルです。編集者が携帯電話を持ってきましたので、興味のある方はぜひ見に来てください! Xiaomi 携帯電話の IP アドレスはどこですか? 1. まず Xiaomi 携帯電話の設定機能を開き、[マイ デバイス] を選択してクリックして入力します; 2. 次に、マイ デバイス機能ページで [すべてのパラメータ] サービスをクリックします; 3次に、[すべてのパラメータ] ページで、一番下にスライドして [ステータス情報] を選択します; 4. 最後に、ステータス情報インターフェイスで IP アドレスを確認できます。

Xianyu_ShareのIPアドレスを変更する場所 XianyuのIPアドレスを変更する方法 Xianyu_ShareのIPアドレスを変更する場所 XianyuのIPアドレスを変更する方法 Mar 20, 2024 pm 05:06 PM

Xianyu は非常に実用的な中古品取引プラットフォームです。ここではさまざまな商品を購入したり、自分の遊休アイテムを販売したりできます。住所を変更したい場合はどうすればよいですか?以下のエディターで見てみましょう! Xianyu IP アドレスを変更する方法を共有します。まず、Xianyu ソフトウェアを開きます。ホームページに入ると、左上隅に海鮮市場、推奨事項、住所、その他のオプションが表示されます。「アドレス」をクリックします。 2. 次に、住所ページで住所の横にある [下矢印] をクリックします; 3. 最後にクリックした後、都市選択ページで都市をクリックします。

Douyin IP アドレスの場所を変更するにはどうすればよいですか? IP アドレスが場所を変えるのはなぜですか? Douyin IP アドレスの場所を変更するにはどうすればよいですか? IP アドレスが場所を変えるのはなぜですか? Mar 21, 2024 pm 06:30 PM

ユーザーは自分の生活を共有し、自分の才能を披露し、Douyin を通じて全国、さらには世界中のネチズンと交流します。プライバシー保護や地理的制限などの理由で、Douyin の IP アドレスを変更したいユーザーもいます。では、Douyin IP アドレスはどのようにして位置を変更するのでしょうか? 1.Douyin IP アドレスの場所を変更するにはどうすればよいですか?プロキシ サーバーは、ユーザーの要求をインターネットに転送し、応答を返すために使用される仲介サービスです。プロキシ サーバーを構成することにより、ユーザーは実際の IP アドレスを隠したり、IP アドレスを変更したりできます。このアプローチは、ユーザーのプライバシーを保護し、ネットワークのセキュリティを向上させるのに役立ちます。プロキシ サーバーを使用して、制限されたコンテンツにアクセスしたり、地理位置情報の制限を回避したりすることもできます。全体として、プロキシ サーバーの使用は、ユーザーがインターネットをより安全かつ自由に閲覧できるようにする実用的なネットワーク ツールです。

Springbootがjarパッケージにファイルを読み込んだ後にファイルにアクセスできない問題を解決する方法 Springbootがjarパッケージにファイルを読み込んだ後にファイルにアクセスできない問題を解決する方法 Jun 03, 2023 pm 04:38 PM

Springboot はファイルを読み取りますが、jar パッケージにパッケージ化した後、最新の開発にアクセスできません。jar パッケージにパッケージ化した後、Springboot がファイルを読み取れない状況があります。その理由は、パッケージ化後、ファイルの仮想パスが変更されるためです。は無効であり、ストリーム経由でのみアクセスできます。読み取ります。ファイルはリソースの下にあります publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

PHPはIPアドレスクエリ機能を実装します PHPはIPアドレスクエリ機能を実装します Jun 22, 2023 pm 11:22 PM

インターネットの急速な発展に伴い、IP アドレスはネットワーク通信に不可欠な部分になりました。 IP アドレス情報は、ネットワーク セキュリティの監視、トラフィック管理、ターゲットを絞った電子商取引広告において非常に重要です。したがって、ユーザーが IP アドレス/ドメイン名情報を簡単に照会できるようにするために、多くの Web サイトでは IP アドレス照会機能が提供されています。この記事では、読者の参考のために、PHP を使用して IP アドレスクエリ機能を実装する方法を紹介します。 1. IP アドレスとは何ですか? IP アドレス (InternetProtocolAddress) はネットワーク プロトコルです

ビットコイントランザクションIPアドレス(ビットコイントランザクションIPアドレスは公開されていますか?) ビットコイントランザクションIPアドレス(ビットコイントランザクションIPアドレスは公開されていますか?) Feb 06, 2024 am 10:03 AM

ビットコイン トランザクション IP アドレス ビットコイン トランザクション IP アドレスは、ビットコイン トランザクション システムに不可欠かつ重要なコンポーネントです。これは、ビットコイントレーダーがビットコイン取引を行うことができるビットコイン取引プラットフォームの中核です。ビットコイン取引 IP アドレスは、ビットコイン取引システムの基礎であり、ビットコイン トレーダーがビットコイン取引を行うための基盤です。ビットコイン取引 IP アドレスは、ビットコイン取引システムのサーバーとトレーダーのデバイスを見つけるために使用されるグローバル ネットワーク アドレスです。ビットコイントランザクションの IP アドレスをクエリすることで、トランザクションのステータスと関連情報を取得できます。さらに、ビットコイン取引 IP アドレスは、クライアントをビットコイン取引システムやトレーダーのデバイスに接続するためにも使用できます。ビットコイントランザクションのIPアドレスは公開されていますか?ビットコイントランザクションのIPアドレスは公開されません

See all articles