当前位置:网站首页>根据IP获取地市
根据IP获取地市
2022-07-07 02:29:00 【Q z1997】
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
/** * 根据IP获取地址信息 * * @author zhangqi * @date 2022/7/3 20:32 */
@SuppressWarnings("unused")
@Slf4j
public class AddressUtils {
/** * IP地址查询 */
private static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";
/** * 未知地址 */
private static final String UNKNOWN = "XX XX";
public static String getRealAddressByIP(String ip) {
// 内网不查询
if (internalIp(ip)) {
return "内网IP";
}
try {
HttpResponse httpResponse = HttpUtils.get(IP_URL + "ip=" + ip + "&json=true", null, null, CharsetUtil.CHARSET_GBK);
if (!httpResponse.isOk()) {
return UNKNOWN;
}
String body = httpResponse.body();
if (StringUtils.isEmpty(body)) {
return UNKNOWN;
}
JSONObject obj = JSON.parseObject(body);
String region = obj.getString("pro");
String city = obj.getString("city");
return String.format("%s %s", region, city);
} catch (Exception e) {
log.error("获取地理位置异常 {}", ip);
}
return UNKNOWN;
}
/** * 检查是否为内部IP地址 * * @param ip IP地址 * @return 结果 */
public static boolean internalIp(String ip) {
byte[] addr = textToNumericFormatV4(ip);
return internalIp(addr) || "127.0.0.1".equals(ip);
}
/** * 检查是否为内部IP地址 * * @param addr byte地址 * @return 结果 */
private static boolean internalIp(byte[] addr) {
if (ArrayUtils.isEmpty(addr) || addr.length < 2) {
return true;
}
final byte b0 = addr[0];
final byte b1 = addr[1];
// 10.x.x.x/8
final byte SECTION_1 = 0x0A;
// 172.16.x.x/12
final byte SECTION_2 = (byte) 0xAC;
final byte SECTION_3 = (byte) 0x10;
final byte SECTION_4 = (byte) 0x1F;
// 192.168.x.x/16
final byte SECTION_5 = (byte) 0xC0;
final byte SECTION_6 = (byte) 0xA8;
switch (b0) {
case SECTION_1:
return true;
case SECTION_2:
return (b1 >= SECTION_3 && b1 <= SECTION_4);
case SECTION_5:
return (b1 == SECTION_6);
default:
return false;
}
}
/** * 将IPv4地址转换成字节 * * @param text IPv4地址 * @return byte 字节 */
private static byte[] textToNumericFormatV4(String text) {
if (text.length() == 0) {
return new byte[0];
}
byte[] bytes = new byte[4];
String[] elements = text.split("\\.", -1);
try {
long l;
int i;
switch (elements.length) {
case 1:
l = Long.parseLong(elements[0]);
if ((l < 0L) || (l > 4294967295L)) {
return new byte[0];
}
bytes[0] = (byte) (int) (l >> 24 & 0xFF);
bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
bytes[3] = (byte) (int) (l & 0xFF);
break;
case 2:
l = Integer.parseInt(elements[0]);
if ((l < 0L) || (l > 255L)) {
return new byte[0];
}
bytes[0] = (byte) (int) (l & 0xFF);
l = Integer.parseInt(elements[1]);
if ((l < 0L) || (l > 16777215L)) {
return new byte[0];
}
bytes[1] = (byte) (int) (l >> 16 & 0xFF);
bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
bytes[3] = (byte) (int) (l & 0xFF);
break;
case 3:
for (i = 0; i < 2; ++i) {
l = Integer.parseInt(elements[i]);
if ((l < 0L) || (l > 255L)) {
return new byte[0];
}
bytes[i] = (byte) (int) (l & 0xFF);
}
l = Integer.parseInt(elements[2]);
if ((l < 0L) || (l > 65535L)) {
return new byte[0];
}
bytes[2] = (byte) (int) (l >> 8 & 0xFF);
bytes[3] = (byte) (int) (l & 0xFF);
break;
case 4:
for (i = 0; i < 4; ++i) {
l = Integer.parseInt(elements[i]);
if ((l < 0L) || (l > 255L)) {
return new byte[0];
}
bytes[i] = (byte) (int) (l & 0xFF);
}
break;
default:
return new byte[0];
}
} catch (NumberFormatException e) {
return new byte[0];
}
return bytes;
}
}
边栏推荐
- 【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
- 途家、木鸟、美团……民宿暑期战事将起
- 精准时空行程流调系统—基于UWB超高精度定位系统
- [start from scratch] detailed process of deploying yolov5 in win10 system (CPU, no GPU)
- C语言面试 写一个函数查找两个字符串中的第一个公共字符串
- 大促过后,销量与流量兼具,是否真的高枕无忧?
- Handling hardfault in RT thread
- 哈趣投影黑马之姿,仅用半年强势突围千元投影仪市场!
- MYSQL binlog相关命令
- Etcd database source code analysis -- starting from the start function of raftnode
猜你喜欢
Force deduction 62 different paths (the number of all paths from the upper left to the lower right of the matrix) (dynamic planning)
拼多多败诉:“砍价免费拿”侵犯知情权但不构成欺诈,被判赔400元
哈趣投影黑马之姿,仅用半年强势突围千元投影仪市场!
LM small programmable controller software (based on CoDeSys) Note 23: conversion of relative coordinates of servo motor operation (stepping motor) to absolute coordinates
雷特智能家居龙海祁:从专业调光到全宅智能,20年专注成就专业
【从零开始】win10系统部署Yolov5详细过程(CPU,无GPU)
Several key steps of software testing, you need to know
学术报告系列(六) - Autonomous Driving on the journey to full autonomy
MySQL卸载文档-Windows版
Redis(一)——初识Redis
随机推荐
直击2022ECDC萤石云开发者大会:携手千百行业加速智能升级
matlab / ENVI 主成分分析实现及结果分析
如何给目标机器人建模并仿真【数学/控制意义】
C语言面试 写一个函数查找两个字符串中的第一个公共字符串
程序员的日常 | 每日趣闻
Abnova 膜蛋白脂蛋白体技术及类别展示
Haqi projection Black Horse posture, avec seulement six mois de forte pénétration du marché des projecteurs de 1000 yuans!
Leetcode T1165: 日志分析
Overview of FlexRay communication protocol
Knight defeats demon king (Backpack & DP)
屏幕程序用串口无法调试情况
一段程序让你明白什么静态内部类,局部内部类,匿名内部类
MySQL installation
博士申请 | 上海交通大学自然科学研究院洪亮教授招收深度学习方向博士生
当前发布的SKU(销售规格)信息中包含疑似与宝贝无关的字
使用net core优势/为什么使用
DB2获取表信息异常:Caused by: com.ibm.db2.jcc.am.SqlException: [jcc][t4][1065][12306][4.25.13]
Abnova循环肿瘤DNA丨全血分离,基因组DNA萃取分析
Stack and queue-p78-8 [2011 unified examination true question]
Markdown displays pictures side by side