java查询ip归属地
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归属地相关推荐
- 利用IP地址查询接口来查询IP归属地
如果我们在项目中需要获得用户的地址,而不仅仅是获得用户的IP,为了避免在自己的数据库里添加IP库,可以直接调用网上的第3方IP地址查询接口来查询IP归属地.今儿个在网上了解了这些接口,要么返回XML, ...
- linux 查询ip归属地的工具,Linux 通过shell查询ip归属地(curl请求转码)
root@kickseed:~# ping www.baidu.com #用百度进行测试获取百度IP ...
- shell 抓取页面信息 ip168查询 IP归属地
通过ip168批量查询ip归属地#!/bin/bash while read line do echo $line ip=$(echo -en $line | awk '{print $3}' | a ...
- 【实战篇】| 模拟 20 万数据快速查询 IP 归属地
点击"小詹学Python",选择"置顶"公众号 重磅干货,第一时间送达 本文转载自一个不甘平凡的码农 这篇文章主要深入数据结构与算法在解决实际问题怎么运用和分析 ...
- php查询ip归属地api接口_【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地...
本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得 ...
- 任何快速查询IP归属地
最近公司项目需要做一个IP归属地查询的功能,想着如果用现成的API就可以大大提高开发效率,所以在网上的API商店搜索了一番,发现了 APISpace,它里面的IP归属地API非常符合我的开发需求. I ...
- php查询ip归属地api接口_php调用新浪接口查询ip获取地理位置(ip归属地查询)
php调用新浪接口查询ip获取地理位置(ip归属地查询) 发布于 2014-11-17 08:35:58 | 115 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: ...
- python批量查询ip归属地_python3.2批量查询IP地址区域
import urllib.request #jk409 2014-7-31 by python3.4编写用于[批量]查询IP地址国家区域 def chaxun(ip_addr): ip_addr2 ...
- 利用淘宝IP查询接口,免费查询IP归属地
这个接口比其他网站提供的接口都好,查询限制是每个用户的访问频率需小于10qps,也就是说每秒限制10次查询,几乎可以说是无限制了 接口使用说明: 1. 请求接口(GET): http://ip.tao ...
- 使用淘宝接口查询ip归属地
首先很抱歉的说一句,因为这个需求是很久之前弄的,然后也是找的资料,但是因为没有保存原网址...所以就没有贴原址了. 写这个主要是为了方便自己以后查看.(找到原址了我会立马贴上,或者有知道的大兄弟们也可 ...
最新文章
- hibernate框架int和Integer类型区别
- 如何实现Asp与Asp.Net共享Session
- libsvm java下载_java-libsvm 版 结合已有数据集的demo,方便初学者使用 Develop 238万源代码下载- www.pudn.com...
- 中文分词算法工具hanlp源码解析
- java连接mysql实现增删改查_JDBC之Java连接mysql实现增删改查
- 解决error: Microsoft Visual C++ 14.0 is required 问题
- Implement Trie (Prefix Tree)
- 转:Ajax与CustomErrors的尴尬
- “互联网+”大学生创新创业大赛项目策划书
- 云计算机什么意思啊,什么叫云计算,云计算是什么,最通俗的解释是这样的
- b和kb的换算_KB和MB怎么换算?
- Android FFmpeg视频播放器一解封装
- HiveException: xx with newer attempt ID 1 is smaller than the file xx with with older attempt ID 0
- 换肤方案,换肤策略,App插件式换肤实现方案
- 特征方程求数列的通项公式(二阶线性递推式)
- linux内核区分光口电口吗,服务器网卡光口和电口的区别?
- IaaS PaaS SaaS 读音及含义
- 企业为什么需要两化融合管理体系
- 瓜子智能在线客服整体架构
- 根据股票当日涨幅和换手率预测其下一交易日的涨跌情况[Python实现]