当前位置:网站首页>根据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;
}
}
边栏推荐
- 反射(二)
- Redhat5 installing vmware tools under virtual machine
- Go straight to the 2022ecdc fluorite cloud Developer Conference: work with thousands of industries to accelerate intelligent upgrading
- MySQL卸载文档-Windows版
- 微信小程序隐藏video标签的进度条组件
- impdp的transform参数的测试
- Ha Qu projection dark horse posture, only half a year to break through the 1000 yuan projector market!
- 企业如何进行数据治理?分享数据治理4个方面的经验总结
- Stack and queue-p79-10 [2014 unified examination real question]
- How to install swoole under window
猜你喜欢
Learning notes | data Xiaobai uses dataease to make a large data screen
偏执的非合格公司
学习笔记|数据小白使用DataEase制作数据大屏
力扣62 不同路径(从矩阵左上到右下的所有路径数量) (动态规划)
Programmers' daily | daily anecdotes
Prompt for channel security on the super-v / device defender side when installing vmmare
LM11丨重构K线构建择时交易策略
String (explanation)
毕业设计游戏商城
LM small programmable controller software (based on CoDeSys) Note 23: conversion of relative coordinates of servo motor operation (stepping motor) to absolute coordinates
随机推荐
ICML 2022 | 探索语言模型的最佳架构和训练方法
C language interview to write a function to find the first public string in two strings
MySQL的安装
js装饰器@decorator学习笔记
肿瘤免疫治疗研究丨ProSci LAG3抗体解决方案
地质学类比较有名的外文期刊有哪些?
c语言(结构体)定义一个User结构体,含以下字段:
Leetcode T1165: 日志分析
ip地址那点事
Ha Qu projection dark horse posture, only half a year to break through the 1000 yuan projector market!
ViewModelProvider.of 过时方法解决
[opencv] morphological filtering (2): open operation, morphological gradient, top hat, black hat
Markdown displays pictures side by side
港科大&MSRA新研究:关于图像到图像转换,Fine-tuning is all you need
Stack and queue-p79-9
一条慢SQL拖死整个系统
学术报告系列(六) - Autonomous Driving on the journey to full autonomy
「运维有小邓」符合GDPR的合规要求
Redhat5 installing vmware tools under virtual machine
常用函数detect_image/predict