<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近,各大平臺都新增了評論區顯示發言者ip歸屬地的功能,例如嗶哩嗶哩,微博,知乎等等。
主要分為以下幾步
因為每一次使用者的 Request 請求,都會攜帶上請求的 IP 地址放到請求頭中。
public class IpUtils { /** * 獲取ip地址 * @param request * @return */ public static String getIpAddr(HttpServletRequest request){ String ipAddress = null; try { ipAddress = request.getHeader("X-Forwarded-For"); if (ipAddress != null && ipAddress.length() != 0 && !"unknown".equalsIgnoreCase(ipAddress)) { // 多次反向代理後會有多個ip值,第一個ip才是真實ip if (ipAddress.indexOf(",") != -1) { ipAddress = ipAddress.split(",")[0]; } } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("Proxy-Client-IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("WL-Proxy-Client-IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("HTTP_CLIENT_IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); } }catch (Exception e) { log.error("IPUtils ERROR ",e); } return ipAddress; }
對這裡出現的幾個名詞解釋一下:
這裡,要著重介紹一下Ip2region專案。
github地址:github.com/lionsoul201…
一個準確率 99.9% 的離線 IP 地址定位庫,0.0x 毫秒級查詢,ip2region.db 資料庫只有數MB,提供了 java,php,c,python,nodejs,golang,c# 等查詢繫結和Binary,B樹,記憶體三種查詢演演算法。
全部的查詢使用者端單次查詢都在 0.x 毫秒級別,內建了三種查詢演演算法
1、引入ip2region依賴
<dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>1.7.2</version> </dependency>
2、下載倉庫中的ip2region.db 檔案,放到工程resources目錄下
3、編寫方法載入ip2region檔案,對使用者ip地址進行轉換。
/** * 獲取ip屬地 * @param ip * @return * @throws Exception */ public static String getCityInfo(String ip) throws Exception { //獲得檔案流時,因為讀取的檔案是在打好jar檔案裡面,不能直接通過檔案資源路徑拿到檔案,但是可以在jar包中拿到檔案流 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources("ip2region.db"); Resource resource = resources[0]; InputStream is = resource.getInputStream(); File target = new File("ip2region.db"); FileUtils.copyInputStreamToFile(is, target); is.close(); if (StringUtils.isEmpty(String.valueOf(target))) { log.error("Error: Invalid ip2region.db file"); return null; } DbConfig config = new DbConfig(); DbSearcher searcher = new DbSearcher(config, String.valueOf(target)); //查詢演演算法 //B-tree, B樹搜尋(更快) int algorithm = DbSearcher.BTREE_ALGORITHM; try { //define the method Method method; method = searcher.getClass().getMethod("btreeSearch", String.class); DataBlock dataBlock; if (!Util.isIpAddress(ip)) { log.error("Error: Invalid ip address"); } dataBlock = (DataBlock) method.invoke(searcher, ip); String ipInfo = dataBlock.getRegion(); if (!StringUtils.isEmpty(ipInfo)) { ipInfo = ipInfo.replace("|0", ""); ipInfo = ipInfo.replace("0|", ""); } return ipInfo; } catch (Exception e) { e.printStackTrace(); } return null; }
4、由於 ip 屬地在國內的話,只會展示省份,而國外的話,只會展示國家。所以我們還需要對這個方法進行一下封裝,得到獲取 IP 屬地的資訊。
public static String getIpPossession(String ip) throws Exception { String cityInfo = IpUtils.getCityInfo(ip); if (!StringUtils.isEmpty(cityInfo)) { cityInfo = cityInfo.replace("|", " "); String[] cityList = cityInfo.split(" "); if (cityList.length > 0) { // 國內的顯示到具體的省 if ("中國".equals(cityList[0])) { if (cityList.length > 1) { return cityList[1]; } } // 國外顯示到國家 return cityList[0]; } } return "未知"; }
5、編寫測試類。
public static void main(String[] args) throws Exception { //國內ip String ip1 = "220.248.12.158"; String cityInfo1 = IpUtils.getCityInfo(ip1); System.out.println(cityInfo1); String address1 = IpUtils.getIpPossession(ip1); System.out.println(address1); //國外ip String ip2 = "67.220.90.13"; String cityInfo2 = IpUtils.getCityInfo(ip2); System.out.println(cityInfo2); String address2 = IpUtils.getIpPossession(ip2); System.out.println(address2); }
6、測試結果
想了解的小夥伴可以學習一下!
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>1.7.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency>
以上就是Java根據ip地址獲取歸屬地範例詳解的詳細內容,更多關於Java根據ip獲取歸屬地的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45