当前位置:网站首页>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;
}
}
边栏推荐
- Unable to debug screen program with serial port
- 反射(二)
- A program lets you understand what static inner classes, local inner classes, and anonymous inner classes are
- Stack and queue-p79-9
- The latest trends of data asset management and data security at home and abroad
- 学习笔记|数据小白使用DataEase制作数据大屏
- Postgresql源码(60)事务系统总结
- Abnova循环肿瘤DNA丨全血分离,基因组DNA萃取分析
- [solution] final app status- undefined, exitcode- 16
- Config分布式配置中心
猜你喜欢
随机推荐
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`问题解决
项目实战 五 拟合直线 获得中线
企业如何进行数据治理?分享数据治理4个方面的经验总结
Jetpack Compose 远不止是一个UI框架这么简单~
ViewModelProvider.of 过时方法解决
sqlserver多线程查询问题
Redis (II) - redis General Command
Navicat importing 15g data reports an error [2013 - lost connection to MySQL server during query] [1153: got a packet bigger]
[GNN] graphic gnn:a gender Introduction (including video)
2018年江苏省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书
mobx 知识点集合案例(快速入门)
SolidWorks GB Library (steel profile library, including aluminum profile, aluminum tube and other structures) installation and use tutorial (generating aluminum profile as an example)
jdbc数据库连接池使用问题
健身房如何提高竞争力?
快速定量,Abbkine 蛋白质定量试剂盒BCA法来了!
MYSQL----导入导出&视图&索引&执行计划
leetcode 509. Fibonacci Number(斐波那契数字)
剑指offer-高质量的代码
使用TCP/IP四层模型进行网络传输的基本流程
Can't you really do it when you are 35 years old?