java查询ip归属地

  • 什么是ip2region
  • pom文件添加依赖
  • 下载:ip2region.db 地址库
  • 放在resources文件夹下
  • 代码就简单了
  • 返回格式

之前从网上看了大多数都是调用淘宝的api来查询归属地,但是我试了各种方法,淘宝的一直返回301,返回结果中也没有新的请求地址。可能也是我调用方法不对吧,给大家分享一下另一种方式来查询ip归属地的方法

什么是ip2region

ip2region是一套准确率99.9%的ip地址定位库,0.0x毫秒级查询,数据库文件大小只有1.6M,提供了java, php, c, python,nodejs,golang查询绑定和Binary,B树,内存三种查询算法。需要的朋友可以下载!

99.9%准确率,定时更新:数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比纯真啥的准确多了。每次聚合一下数据需要1-2天,会不定时更新。

pom文件添加依赖

<dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>1.7.2</version>
</dependency>

下载:ip2region.db 地址库

https://pan.baidu.com/s/10uIcmXnEo3Yt4RgdNqouGA
提取码:8888

放在resources文件夹下

代码就简单了

package com.leimingtech.start.controller;import com.leimingtech.start.service.StartLogService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;@RestController
@Slf4j
public class StartController {@Autowiredprivate StartLogService strartLogService;@PostMapping("save")public void startLog() {RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();String ipAddr = getIpAddr(request);log.info("ip:{}",ipAddr);strartLogService.save(ipAddr);}public static String getIpAddr(HttpServletRequest request) {String ip = null;try {ip = request.getHeader("x-forwarded-for");if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_CLIENT_IP");}if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_X_FORWARDED_FOR");}if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}if (StringUtils.isNotBlank(ip)) {// 多次反向代理后会有多个IP值,第一个为真实IP。int index = ip.indexOf(',');if (index != -1) {return ip.substring(0, index);} else {return ip;}}} catch (Exception e) {}return ip;}
}

package com.leimingtech.start.service.impl;import cn.hutool.core.io.resource.ClassPathResource;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.leimingtech.start.dao.StartLogDao;
import com.leimingtech.start.entity.StartLogEntity;
import com.leimingtech.start.service.StartLogService;
import lombok.extern.slf4j.Slf4j;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.*;
import java.lang.reflect.Method;
import java.util.Date;@Service
@Slf4j
public class StartLogServiceImpl implements StartLogService {@Autowiredprivate StartLogDao startLogDao;@Overridepublic void save(String ipAddr) {String ipString = getCityInfo(ipAddr);log.info("ip归属:{}",ipString);StartLogEntity entity = StartLogEntity.builder().id(IdWorker.getId()).area(ipString).ip(ipAddr).createDate(new Date()).build();startLogDao.insert(entity);}/*** 根据ip获取详细地址*/public static String getCityInfo(String ip) {DbSearcher searcher = null;try {String path = "ip2region/ip2region.db";String name = "ip2region.db";DbConfig config = new DbConfig();File file = inputStreamToFile(new ClassPathResource(path).getStream(), name);searcher = new DbSearcher(config, file.getPath());Method method;method = searcher.getClass().getMethod("btreeSearch", String.class);DataBlock dataBlock;dataBlock = (DataBlock) method.invoke(searcher, ip);String address = dataBlock.getRegion().replace("0|", "");char symbol = '|';if (address.charAt(address.length() - 1) == symbol) {address = address.substring(0, address.length() - 1);}return address.equals("内网IP|内网IP") ? "内网IP" : address;} catch (Exception e) {e.printStackTrace();} finally {if (searcher != null) {try {searcher.close();} catch (IOException ignored) {}}}return "";}/*** inputStream 转 File*/public static File inputStreamToFile(InputStream ins, String name) throws Exception {File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name);if (file.exists()) {return file;}OutputStream os = new FileOutputStream(file);int bytesRead;int len = 8192;byte[] buffer = new byte[len];while ((bytesRead = ins.read(buffer, 0, len)) != -1) {os.write(buffer, 0, bytesRead);}os.close();ins.close();return file;}}

返回格式

根据需要自己更改组合方式

java查询ip归属地相关推荐

  1. 利用IP地址查询接口来查询IP归属地

    如果我们在项目中需要获得用户的地址,而不仅仅是获得用户的IP,为了避免在自己的数据库里添加IP库,可以直接调用网上的第3方IP地址查询接口来查询IP归属地.今儿个在网上了解了这些接口,要么返回XML, ...

  2. linux 查询ip归属地的工具,Linux 通过shell查询ip归属地(curl请求转码)

    root@kickseed:~# ping www.baidu.com                                                   #用百度进行测试获取百度IP ...

  3. shell 抓取页面信息 ip168查询 IP归属地

    通过ip168批量查询ip归属地#!/bin/bash while read line do echo $line ip=$(echo -en $line | awk '{print $3}' | a ...

  4. 【实战篇】| 模拟 20 万数据快速查询 IP 归属地

    点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自一个不甘平凡的码农 这篇文章主要深入数据结构与算法在解决实际问题怎么运用和分析 ...

  5. php查询ip归属地api接口_【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地...

    本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得 ...

  6. 任何快速查询IP归属地

    最近公司项目需要做一个IP归属地查询的功能,想着如果用现成的API就可以大大提高开发效率,所以在网上的API商店搜索了一番,发现了 APISpace,它里面的IP归属地API非常符合我的开发需求. I ...

  7. php查询ip归属地api接口_php调用新浪接口查询ip获取地理位置(ip归属地查询)

    php调用新浪接口查询ip获取地理位置(ip归属地查询) 发布于 2014-11-17 08:35:58 | 115 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: ...

  8. python批量查询ip归属地_python3.2批量查询IP地址区域

    import urllib.request #jk409  2014-7-31 by python3.4编写用于[批量]查询IP地址国家区域 def chaxun(ip_addr): ip_addr2 ...

  9. 利用淘宝IP查询接口,免费查询IP归属地

    这个接口比其他网站提供的接口都好,查询限制是每个用户的访问频率需小于10qps,也就是说每秒限制10次查询,几乎可以说是无限制了 接口使用说明: 1. 请求接口(GET): http://ip.tao ...

  10. 使用淘宝接口查询ip归属地

    首先很抱歉的说一句,因为这个需求是很久之前弄的,然后也是找的资料,但是因为没有保存原网址...所以就没有贴原址了. 写这个主要是为了方便自己以后查看.(找到原址了我会立马贴上,或者有知道的大兄弟们也可 ...

最新文章

  1. hibernate框架int和Integer类型区别
  2. 如何实现Asp与Asp.Net共享Session
  3. libsvm java下载_java-libsvm 版 结合已有数据集的demo,方便初学者使用 Develop 238万源代码下载- www.pudn.com...
  4. 中文分词算法工具hanlp源码解析
  5. java连接mysql实现增删改查_JDBC之Java连接mysql实现增删改查
  6. 解决error: Microsoft Visual C++ 14.0 is required 问题
  7. Implement Trie (Prefix Tree)
  8. 转:Ajax与CustomErrors的尴尬
  9. “互联网+”大学生创新创业大赛项目策划书
  10. 云计算机什么意思啊,什么叫云计算,云计算是什么,最通俗的解释是这样的
  11. b和kb的换算_KB和MB怎么换算?
  12. Android FFmpeg视频播放器一解封装
  13. HiveException: xx with newer attempt ID 1 is smaller than the file xx with with older attempt ID 0
  14. 换肤方案,换肤策略,App插件式换肤实现方案
  15. 特征方程求数列的通项公式(二阶线性递推式)
  16. linux内核区分光口电口吗,服务器网卡光口和电口的区别?
  17. IaaS PaaS SaaS 读音及含义
  18. 企业为什么需要两化融合管理体系
  19. 瓜子智能在线客服整体架构
  20. 根据股票当日涨幅和换手率预测其下一交易日的涨跌情况[Python实现]

热门文章

  1. 聚合数据API用法简介
  2. ssize_t和size_t详解
  3. [TravelNotes] CTSC 2017 APIO 2017 THUPC 2017 游记
  4. matlab 输出两列,Matlab绘制两列正弦波的叠加
  5. 服务器台式机装win7系统,服务器主机装win7系统安装
  6. Tumblr营销大法(三)
  7. JS基础-模拟京东快递单号查询案例
  8. python学习:用两种思路计算质数与合数
  9. mac制作linux启动盘,Mac 下制作开机启动盘,做了一个Centos7 的系统U盘
  10. 总结Windows查看产品密匙方法