当前位置:网站首页>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;
}
}
边栏推荐
- 场馆怎么做体育培训?
- 程序员的日常 | 每日趣闻
- 精准时空行程流调系统—基于UWB超高精度定位系统
- Jmeter 5.5版本发布说明
- JWT 认证
- Postgresql中procedure支持事务语法(实例&分析)
- Leite smart home longhaiqi: from professional dimming to full house intelligence, 20 years of focus on professional achievements
- The difference between string constants and string objects when allocating memory
- Networkx绘图和常用库函数坐标绘图
- C language interview to write a function to find the first occurrence of substring m in string n.
猜你喜欢
Prompt for channel security on the super-v / device defender side when installing vmmare
Learning notes | data Xiaobai uses dataease to make a large data screen
MySQL卸载文档-Windows版
大促过后,销量与流量兼具,是否真的高枕无忧?
unity3d学习笔记
拼多多败诉:“砍价免费拿”侵犯知情权但不构成欺诈,被判赔400元
化工园区危化品企业安全风险智能化管控平台建设四大目标
学术报告系列(六) - Autonomous Driving on the journey to full autonomy
Etcd database source code analysis -- starting from the start function of raftnode
2018年江苏省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书
随机推荐
Go straight to the 2022ecdc fluorite cloud Developer Conference: work with thousands of industries to accelerate intelligent upgrading
Leetcode T1165: 日志分析
Unity C# 函数笔记
Take you to brush (niuke.com) C language hundred questions (the first day)
Redis (I) -- getting to know redis for the first time
企業如何進行數據治理?分享數據治理4個方面的經驗總結
from .onnxruntime_pybind11_state import * # noqa ddddocr运行报错
【解决】Final app status- UNDEFINED, exitCode- 16
Abnova 体外转录 mRNA工作流程和加帽方法介绍
LM small programmable controller software (based on CoDeSys) Note 23: conversion of relative coordinates of servo motor operation (stepping motor) to absolute coordinates
unity3d学习笔记
工具类:对象转map 驼峰转下划线 下划线转驼峰
剑指offer-高质量的代码
请教一个问题,flink oracle cdc,读取一个没有更新操作的表,隔十几秒就重复读取全量数据
LM11丨重构K线构建择时交易策略
项目实战 五 拟合直线 获得中线
Stack and queue-p79-10 [2014 unified examination real question]
MySQL SQL的完整处理流程
当前发布的SKU(销售规格)信息中包含疑似与宝贝无关的字
多学科融合