我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java根据用户请求获取ip地址,并解析省市信息

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java根据用户请求获取ip地址,并解析省市信息

目录

1.选型

1.1 实现方式

Java可以实现IP地址解析和省市区信息查询,但是需要借助一些外部数据源或数据库来实现。常用的方法有以下几种:

1.1.1 本地文件解析

可以通过下载最新的IP地址段数据文件,然后在程序中解析该文件来获取IP地址对应的省市区等信息。不过这种方法需要手动维护IP库文件,并且更新和查询速度可能较慢,不适合高并发或大规模的应用场景。

1.1.2 数据库查询

可以将IP地址段数据存储在数据库中,然后根据用户请求的IP地址来查询对应的省市区等信息。常用的数据库有MySQL、Oracle、SQL Server等。这种方法可以提高查询效率和精度,并支持更灵活的查询方式,但是需要考虑数据库的设计和优化问题。

1.1.3 第三方API代理

使用第三方IP查询API代理来实现纯Java的IP地址解析和省市区信息查询。比如通过调用百度地图API、高德地图API等第三方服务来获取IP地址对应的位置信息。这种方法可以免去自行搭建IP数据库的麻烦,同时也能保证查询结果的准确性和实时性,但需要考虑API使用频率和费用等问题。

1.2 常用ip定位库

1.2.1 Ip2region

Ip2region:Ip2region是一个基于Java的IP地址定位库,提供了快速而准确的IP查询服务。它将全球IP地址划分为多级区域,可以根据IP地址获取对应的省市区信息、运营商等详细信息。

1.2.2 GeoLite2

GeoLite2:一款免费的IP地址库,由MaxMind公司开发和维护,提供高精度的IP地址定位服务。可通过下载数据库文件或使用API来查询IP地址对应的位置信息。

1.2.3 IP2Location

IP2Location:一款商业化的IP地址库,提供全球范围内的IP地址定位服务,支持IPv4/IPv6地址解析。可通过订阅服务或购买数据库文件来使用。

1.2.4 ipapi

ipapi:一款云端IP地址查询API,提供高效和准确的IP地址定位服务。支持JSON/XML格式的返回数据,可根据用户需求选择不同的套餐和服务计划。

1.2.5 QQWry

QQWry:国内最广泛使用的IP地址库之一,提供了IP地址到省市区县、运营商等信息的映射。可通过下载最新版的dat文件或使用API来实现IP地址定位。

1.2.6 其他

国内还有很多其他的定位库,如淘宝、新浪、搜狐等ip库,有兴趣的朋友自己了解下。

1.3 选择

综合下面几种情况考虑最后选择了 Ip2region
1.数据来源和准确性:数据是否完整、数据覆盖率、精度和实效性等。
2.许可协议和商业使用:是否需要授权、是否可用于商业用途、是否收费等。
3.支持的语言和平台

2.pom.xml依赖

我自己使用的springboot项目,基础依赖就不列举了

<dependencies>    <dependency>        <groupId>cn.hutoolgroupId>        <artifactId>hutool-allartifactId>        <version>5.4.2version>    dependency>    <dependency>        <groupId>org.lionsoulgroupId>        <artifactId>ip2regionartifactId>        <version>2.7.0version>    dependency>   <dependency>      <groupId>org.projectlombokgroupId>      <artifactId>lombokartifactId>      <scope>providedscope>    dependency>dependencies>

3.代码示例

实体类接收国家、省市等信息。

@Datapublic class IpLocation implements Serializable {    @ApiModelProperty("ip地址")    private String ip;    @ApiModelProperty("国家")    private String country;    @ApiModelProperty("省")    private String province;    @ApiModelProperty("省")    private String city;    @ApiModelProperty("服务商")    private String isp;}

工具类:

@Slf4j//@UtilityClasspublic class IpUtils {        private static final String ZERO="0";        private static final String LOCALHOST="127.0.0.1";        public static String getIpAddress(HttpServletRequest request) {        String ipAddress = request.getHeader("X-Forwarded-For");        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {            ipAddress = request.getHeader("Proxy-Client-IP");        }        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {            ipAddress = request.getHeader("WL-Proxy-Client-IP");        }        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {            ipAddress = request.getRemoteAddr();            if (LOCALHOST.equals(ipAddress)) {                // 根据网卡取本机配置的IP                InetAddress inet = null;                try {                    inet = InetAddress.getLocalHost();                    ipAddress = inet.getHostAddress();                } catch (UnknownHostException e) {                    e.printStackTrace();                }            }        }        // 对于通过多个代理转发的情况,取第一个非unknown的IP地址。        // 这里假设第一个IP为真实IP,后面的为代理IP。        if (ipAddress != null && ipAddress.length() > 15) {            if (ipAddress.indexOf(",") > 0) {                ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));            }        }        return ipAddress;    }        public static IpLocation getLocation(String ip) {        IpLocation location = new IpLocation();        location.setIp(ip);        try (InputStream inputStream = IpUtils.class.getResourceAsStream("/ip2region.xdb");) {            byte[] bytes = IoUtil.readBytes(inputStream);            Searcher searcher = Searcher.newWithBuffer(bytes);            String region = searcher.search(ip);            if (StrUtil.isAllNotBlank(region)) {                // xdb返回格式 国家|区域|省份|城市|ISP,                // 只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0                String[] result = region.split("\\|");                location.setCountry(ZERO.equals(result[0])?StrUtil.EMPTY:result[0]);                location.setProvince(ZERO.equals(result[2])?StrUtil.EMPTY:result[2]);                location.setCity(ZERO.equals(result[3])?StrUtil.EMPTY:result[3]);                location.setIsp(ZERO.equals(result[4])?StrUtil.EMPTY:result[4]);            }            searcher.close();        } catch (Exception e) {            log.error("ip地址解析异常,error:{}",e);            return location;        }        return location;    }}

在官网地址,将data目录下的ip2region.xdb文件复制到resource下。
图片.png
在百度输入ip地址查询,可以查到自己本地公网地址,测试如下(这里为了方便,直接写在了工具类里):
图片.png
如果需要测试 IP 地址查询功能,可以尝试使用一些公共的 IP 地址,例如:

  • 8.8.8.8:谷歌公共 DNS 地址,位于美国。
  • 114.114.114.114:中国电信公共 DNS 地址,位于中国。
  • 1.1.1.1:Cloudflare 公共 DNS 地址,位于澳大利亚。
  • 208.67.222.222:OpenDNS 公共 DNS 地址,位于美国。
  • 176.103.130.130:AdGuard 公共 DNS 地址,位于荷兰。

图片.png

来源地址:https://blog.csdn.net/weixin_43993310/article/details/130873256

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java根据用户请求获取ip地址,并解析省市信息

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录