当前位置:网站首页>Get the city according to IP
Get the city according to IP
2022-07-07 06:51: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;
/** * according to IP Get address information * * @author zhangqi * @date 2022/7/3 20:32 */
@SuppressWarnings("unused")
@Slf4j
public class AddressUtils {
/** * IP Address the query */
private static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";
/** * Unknown address */
private static final String UNKNOWN = "XX XX";
public static String getRealAddressByIP(String ip) {
// Intranet does not query
if (internalIp(ip)) {
return " Intranet 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(" Get the location exception {}", ip);
}
return UNKNOWN;
}
/** * Check whether it is internal IP Address * * @param ip IP Address * @return result */
public static boolean internalIp(String ip) {
byte[] addr = textToNumericFormatV4(ip);
return internalIp(addr) || "127.0.0.1".equals(ip);
}
/** * Check whether it is internal IP Address * * @param addr byte Address * @return result */
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;
}
}
/** * take IPv4 Address to byte * * @param text IPv4 Address * @return byte 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;
}
}
边栏推荐
猜你喜欢

【NOI模拟赛】区域划分(结论,构造)

反射(二)

JWT 认证

LVS+Keepalived(DR模式)学习笔记

This article introduces you to the characteristics, purposes and basic function examples of static routing

MATLAB小技巧(29)多项式拟合 plotfit

The latest trends of data asset management and data security at home and abroad

Leetcode T1165: 日志分析

MySQL的安装

数据资产管理与数据安全国内外最新趋势
随机推荐
from .onnxruntime_pybind11_state import * # noqa ddddocr运行报错
Abnova 免疫组化服务解决方案
The latest trends of data asset management and data security at home and abroad
2022 Android interview essential knowledge points, a comprehensive summary
Abnova 体外转录 mRNA工作流程和加帽方法介绍
MOS tube parameters μ A method of Cox
SolidWorks的GB库(钢型材库,包括铝型材、铝管等结构)安装及使用教程(生成铝型材为例)
LVS+Keepalived(DR模式)学习笔记
「运维有小邓」符合GDPR的合规要求
分布式id解决方案
BindingException 异常(报错)处理
Bus消息总线
多个kubernetes集群如何实现共享同一个存储
Tkinter window selects PCD file and displays point cloud (open3d)
Networkx绘图和常用库函数坐标绘图
Which foreign language periodicals are famous in geology?
Redis (I) -- getting to know redis for the first time
Postgresql源码(59)分析事务ID分配、溢出判断方法
unity3d学习笔记
Abnova循环肿瘤DNA丨全血分离,基因组DNA萃取分析