SpringBoot結合ip2region實現博客評論顯示IP屬地

你好呀,我是小鄒。

在現代的Web應用中,特別是博客和論壇類網站,為用戶提供地理定位服務(如顯示用戶所在地理位置)可以極大地增強用戶體驗。本文將詳細探討如何使用Java和相關技術棧來實現在博客評論中顯示用戶的地址信息,特別關注如何利用ip2region庫解析IP地址獲取地理位置。

效果圖:

在這里插入圖片描述

技術棧:
  • 后端框架:Spring Boot
  • 數據庫:MySQL
  • 前端技術:HTML, CSS, JavaScript
  • 地理編碼庫ip2region
  • 輔助庫Apache Commons IO, Lombok
代碼分析:IpParseUtil

這個類位于com.zou.blog.util包下,提供了幾個關鍵方法用于解析IP地址并獲取用戶的地理位置信息。

ip2region文件:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb

package com.zou.blog.util;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.lionsoul.ip2region.xdb.Searcher;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** ip解析工具** @author zxf* @version v1.0.0* @date 2024/7/14 20:26*/
@Slf4j
public class IpParseUtil {/*** 解析ip地址** @param ipStr 字符串類型ip 例:192.168.0.1* @return 返回結果形式(國家 | 區域 | 省份 | 城市 | ISP) 例 [中國, 0, 河北省, 衡水市, 電信]*/public static List<String> parse(String ipStr) {return parse(ipStr, null);}/*** 自定義解析ip地址** @param ipStr ip 字符串類型ip 例:1970753539(經過轉換后的)* @param index 想要獲取的區間 例如:只想獲取 省,市 index = [2,3]* @return 返回結果例 [北京,北京市]*/public static List<String> parse(String ipStr, int[] index) {try {//獲得文件流時,因為讀取的文件是在打好jar文件里面,不能直接通過文件資源路徑拿到文件,但是可以在jar包中拿到文件流//ResourcePatternResolver的實現方法,可以匹配到各種部署時的各種文件類型例如war,jar,zip等等findPathMatchingResourcesResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] resources = resolver.getResources("ip2region.xdb");Resource resource = resources[0];InputStream is = resource.getInputStream();File target = new File("ip2region.xdb");FileUtils.copyInputStreamToFile(is, target);is.close();Searcher searcher = new Searcher(String.valueOf(target), null, null);long ip = Searcher.checkIP(ipStr);return parse(ip, index, searcher);} catch (Exception e) {log.error("ip解析為long錯誤,ipStr:[{}],錯誤信息:[{}]", ipStr, e.getMessage(), e);throw new RuntimeException("系統異常!");}}/*** 自定義解析ip地址** @param ip    ip Long類型ip* @param index 想要獲取的區間 例如:只想獲取 省,市 index = [2,3]* @return 返回結果例 [湖南省, 衡陽市]*/public static List<String> parse(Long ip, int[] index, Searcher searcher) {List<String> regionList = new ArrayList<>();try {String region = searcher.search(ip);log.info("獲取到的城市信息:" + region);String[] split = region.split("\\|");if (index == null) {regionList = Arrays.asList(split);} else {for (int i : index) {regionList.add(split[i]);}}//關閉資源searcher.close();} catch (Exception e) {log.error("根據ip解析地址失敗,ip:[{}],index[{}],報錯信息:[{}]", ip, index, e.getMessage(), e);throw new RuntimeException("系統異常!");}return regionList;}/*** 獲取IP方法** @author zxf*/public static String getIpAddr(HttpServletRequest request) {if (request == null) {return "unknown";}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("X-Forwarded-For");}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.getHeader("X-Real-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}public static void main(String[] args) {String ip = "218.20.32.122";List<String> parse = parse(ip);System.out.println(parse);}}

關鍵方法解析:

  1. parse(String ipStr) 方法

    • 接收一個字符串類型的IP地址,如"192.168.0.1"。
    • 返回一個列表,其中包含解析得到的地理位置信息,格式為:[國家, 區域, 省份, 城市, ISP]。
  2. parse(String ipStr, int[] index) 方法

    • 提供了更靈活的參數index,允許開發者選擇返回特定范圍的信息,例如僅省份和城市。
    • 返回一個列表,只包含由index參數指定的地理位置信息部分。
  3. getIpAddr(HttpServletRequest request) 方法

    • 從HTTP請求中提取客戶端的IP地址,考慮到可能存在的代理服務器情況。
集成到博客評論系統:

要在博客評論中顯示用戶的位置信息,你可以在處理評論提交的控制器中集成IpParseUtil類的方法。

  1. 獲取IP地址
    在評論提交的控制器中,使用getIpAddr方法從HTTP請求中獲取用戶IP地址。

  2. 解析IP地址
    調用parse方法解析IP地址,獲取用戶的地理位置信息。

  3. 保存位置信息
    將解析得到的位置信息保存至評論模型中,如Comment實體的location字段。

// 在評論控制器中
@PostMapping("/comments")
public ResponseEntity<Comment> createComment(@RequestBody Comment comment, HttpServletRequest request) {String ip = IpParseUtil.getIpAddr(request);List<String> location = IpParseUtil.parse(ip);comment.setLocation(location);// ...保存評論到數據庫...
}
顯示位置信息:

在前端展示評論時,從location字段讀取并顯示信息。

<!-- 前端HTML示例 -->
<div class="comment"><p>By: {{ comment.user.name }}</p><p>Location: {{ comment.location.join(", ") }}</p><p>{{ comment.content }}</p>
</div>

通過上述步驟,我們成功實現了在博客評論中顯示用戶地址信息的功能,這不僅增加了博客的互動性,還為用戶提供了一種直觀的地理位置參考。使用Java和ip2region庫,我們可以高效準確地解析IP地址并獲取地理位置信息,從而提升用戶體驗和網站的吸引力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46074.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46074.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46074.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java實驗3

實驗內容 學生信息管理系統 學生成績表Student(Sno 字符串&#xff0c;長度9, Sname 字符串&#xff0c;長度10, Class 字符串&#xff0c;長度10, Age 整型, Sex 字符串&#xff0c;長度2) 實現如下功能&#xff1a; A&#xff0e;輸入若干個學生的信息到Student表&#x…

初學Python必須知道的14個強大單行代碼

引言&#xff1a;Python的魅力與單行代碼的重要性 Python以其簡潔明了的語法、豐富的內置函數和強大的第三方庫深受廣大開發者喜愛。尤其對于編程小白來說&#xff0c;學習Python就像打開了一扇通向編程世界的大門。而單行代碼&#xff0c;作為Python魅力的一部分&#xff0c;…

【NetTopologySuite類庫】合并所有幾何的包圍盒AABB

流程示意圖 示例代碼 using GeoAPI.Geometries; using Microsoft.VisualStudio.TestTools.UnitTesting; using NetTopologySuite.Geometries; using NetTopologySuite.IO; using System.Collections.Generic; using System.Linq;namespace Test472 {[TestClass]public class T…

深度解析:電商訂單API及其技術實現

隨著電子商務的發展&#xff0c;實體企業開拓電商渠道的越來越多&#xff0c;原有的管理系統都需要增加電商業務管理功能&#xff0c;其中&#xff0c;對電商訂單的管理是每一個電商商家都需要的功能&#xff0c;所以對于開發者來說&#xff0c;了解電商API是什么是非常重要的&…

第100+16步 ChatGPT學習:R實現Xgboost分類

基于R 4.2.2版本演示 一、寫在前面 有不少大佬問做機器學習分類能不能用R語言&#xff0c;不想學Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi轉一下就得了唄。 加上最近也沒啥內容寫了&#xff0c;就幫各位搬運一下吧。 二、R代碼實現Xgboost分類 &#xff08…

LeetCode題練習與總結:比較版本號--165

一、題目描述 給你兩個 版本號字符串 version1 和 version2 &#xff0c;請你比較它們。版本號由被點 . 分開的修訂號組成。修訂號的值 是它 轉換為整數 并忽略前導零。 比較版本號時&#xff0c;請按 從左到右的順序 依次比較它們的修訂號。如果其中一個版本字符串的修訂號較…

C++動態內存的管理

今天來分享C動態內存管理相關知識&#xff0c;閑言勿談&#xff0c;直接上干貨。 1. 動態內存的開辟和銷毀(new和delete) (1)前置知識&#xff1a;我們知道c語言有malloc和calloc和realloc三個函數可以進行動態的開辟內存&#xff0c;那么它們有什么區別呢&#xff1f;首先是…

MPS 后端

本文來自&#xff1a; https://pytorch.org/docs/stable/notes/mps.html https://pytorch.ac.cn/docs/stable/notes/mps.html MPS 后端 mps 設備支持 在使用 Metal 編程框架的 MacOS 設備上&#xff0c;進行高性能 GPU 訓練。 它引入了新的設備&#xff0c;將機器學習計算圖和…

【C語言】條件運算符詳解 - 《 A ? B : C 》

目錄 C語言條件運算符詳解1. 條件運算符的語法和使用示例 1&#xff1a;基本用法輸出 2. 嵌套條件運算符示例 2&#xff1a;嵌套條件運算符輸出 3. 條件運算符與 if-else 語句的比較示例 3&#xff1a;使用 if-else 語句示例 4&#xff1a;使用條件運算符 4. 條件運算符的實際應…

PLC_博圖系列?基本指令”TONR:時間累加器“

PLC_博圖系列?基本指令”TONR&#xff1a;時間累加器“ 文章目錄 PLC_博圖系列?基本指令”TONR&#xff1a;時間累加器“背景介紹TONR&#xff1a; 時間累加器說明參數脈沖時序圖示例 關鍵字&#xff1a; PLC、 西門子、 博圖、 Siemens 、 TONR 背景介紹 這是一篇關于P…

ElasticSearch學習之路

前言 為什么學ElasticSearch&#xff1f; 數據一般有如下三種類型&#xff1a; 結構化數據&#xff0c;如&#xff1a;MySQL的表&#xff0c;一般通過索引提高查詢效率非結構化數據&#xff0c;如&#xff1a;圖片、音頻等不能用表結構表示的數據&#xff0c;一般保存到mong…

Linux C++ 054-設計模式之外觀模式

Linux C 054-設計模式之外觀模式 本節關鍵字&#xff1a;Linux、C、設計模式、外觀模式 相關庫函數&#xff1a; 概念 外觀模式&#xff08;Facade&#xff09;&#xff0c;亦稱“過程模式”。主張按照描述和判斷資料來評價課程&#xff0c;關鍵的活動是在課程實施的全過程中…

昇思25天學習打卡營第24天|基于MindSpore的Diffusion擴散模型

Diffusion擴散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻譯遷移而來&#xff0c;同時參考了由淺入深了解Diffusion Model一文。 關于擴散模型&#xff08;Diffusion Models&#xff09;有很多種理解&#xff0c;本文的介紹是基于denoising di…

基礎動態規劃題目基礎動態規劃題目

目錄 題目1&#xff1a; P1216 [USACO1.5] [IOI1994]數字三角形 Number Triangles 代碼示例&#xff1a; 題目2&#xff1a; Common Subsequence 代碼示例 題目3 &#xff1a;最長上升子序列 最長不下降子序列 最長上升子序列oj答案 題目1&#xff1a; P1216 [USACO1.5]…

SQL面試題練習 —— 查詢每個用戶最大連續登錄天數

目錄 1 題目2 建表語句3 題解 1 題目 查詢每個用戶最大連續登錄天數 樣例數據如下 login_log&#xff1a; 2 建表語句 --建表語句 create table if not exists login_log (user_id int comment 用戶id,login_time date comment 登錄時間 ); --數據插入 INSERT overwrit…

Matlab進階繪圖第63期—帶標記線的三維填充折線圖

三維填充折線圖是在三維折線圖的基礎上&#xff0c;對其與XOY平面之間的部分進行顏色填充&#xff0c;從而能夠更好地刻畫細節變化。 而帶標記線的三維填充折線圖是在其基礎上&#xff0c;添加X相同的一條或多條標記線&#xff0c;以用于進一步討論分析。 由于Matlab中未收錄…

飛睿智能UWB Tag藍牙防丟器標簽,寵物安全新升級,5cm精準定位測距不迷路

寵物早已成為許多家庭不可或缺的一員&#xff0c;它們用無條件的愛溫暖著我們的心房&#xff0c;陪伴我們度過每一個平凡而溫馨的日子。然而&#xff0c;隨著寵物活動范圍的擴大和外界環境的復雜多變&#xff0c;寵物走失的風險也隨之增加。每一次出門遛彎&#xff0c;都像是心…

【學術會議征稿】第六屆光電材料與器件國際學術會議(ICOMD 2024)

第六屆光電材料與器件國際學術會議&#xff08;ICOMD 2024&#xff09; 2024 6th International Conference on Optoelectronic Materials and Devices 第六屆光電材料與器件國際學術會議&#xff08;ICOMD 2024&#xff09;將于2024年11月1-3日在中國重慶召開。 大會面向基…

Windows與Ubuntu安裝ffmpeg

文章目錄 前言ffmpeg的簡介安裝ffmpegWindows下載設置環境變量 Ubuntu 總結 前言 FFmpeg是一款非常強大的開源音視頻處理工具&#xff0c;它包含了眾多的音視頻編解碼庫&#xff0c;可以用于音視頻的采集、編解碼、轉碼、流化、過濾和播放等復雜的處理。在Windows系統上安裝FF…

【Android14 ShellTransitions】(七)Transition就緒

Transition.onTransactionReady的內容比較長&#xff0c;我們挑重點的部分逐段分析&#xff08;跳過的地方并非不重要&#xff0c;而是我柿子挑軟的捏&#xff09;。 1 窗口繪制狀態的流轉以及顯示SurfaceControl 注意我們這里的SurfaceControl特指的是WindowSurfaceControll…