当前位置:网站首页>根据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;
}
}
边栏推荐
- Unable to debug screen program with serial port
- 请问如何查一篇外文文献的DOI号?
- POI导出Excel:设置字体、颜色、行高自适应、列宽自适应、锁住单元格、合并单元格...
- Redis(二)—Redis通用命令
- LM small programmable controller software (based on CoDeSys) Note 23: conversion of relative coordinates of servo motor operation (stepping motor) to absolute coordinates
- 企业如何进行数据治理?分享数据治理4个方面的经验总结
- 精准时空行程流调系统—基于UWB超高精度定位系统
- What books can greatly improve programming ideas and abilities?
- 【解决】Final app status- UNDEFINED, exitCode- 16
- impdp的transform参数的测试
猜你喜欢

Leetcode T1165: 日志分析

哈趣投影黑马之姿,仅用半年强势突围千元投影仪市场!

Shared memory for interprocess communication

What books can greatly improve programming ideas and abilities?

Ha Qu projection dark horse posture, only half a year to break through the 1000 yuan projector market!

Can't you really do it when you are 35 years old?

POI export to excel: set font, color, row height adaptation, column width adaptation, lock cells, merge cells

学习笔记|数据小白使用DataEase制作数据大屏

快速定量,Abbkine 蛋白质定量试剂盒BCA法来了!

MySQL installation
随机推荐
C interview 24 (pointer) define a double array with 20 elements a
Stack and queue-p79-10 [2014 unified examination real question]
Markdown displays pictures side by side
缓存在高并发场景下的常见问题
企業如何進行數據治理?分享數據治理4個方面的經驗總結
C语言面试 写一个函数查找两个字符串中的第一个公共字符串
Several key steps of software testing, you need to know
Can't you really do it when you are 35 years old?
ceres-solver和g2o性能比较
Cloudcompare point pair selection
PostgreSQL database timescaledb function time_ bucket_ Gapfill() error resolution and license replacement
string(讲解)
How to use wechat cloud hosting or cloud functions for cloud development of unapp development applet
二十岁的我4面拿到字节跳动offer,至今不敢相信
网络基础 —— 报头、封装和解包
ip地址那点事
Haqi projection Black Horse posture, avec seulement six mois de forte pénétration du marché des projecteurs de 1000 yuans!
Abnova 免疫组化服务解决方案
企业如何进行数据治理?分享数据治理4个方面的经验总结
Array proof during st table preprocessing