【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)

这篇具有很好参考价值的文章主要介绍了【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【写在前面】
编撰这篇文章还得从之前做安全业务需求说起,我们都知道安全攻击都是在某台客户机上执行某些恶意操作(sql注入,DoS/DDoS攻击),致使服务端响应异常崩溃亦或响应数据被篡改,那么怎么去阻止这些东西呢?
首先我想到的是对访问的web端做一个IP的校验(好比阿里云服务器的安全组设置),建立一些白名单,这样能在很大程度上做到一个限制,其实在服务端也应该要开启防火墙、设置权限等。那么我们首先得知道客户端的IP是多少。接下来此文重点介绍如何获取。

1、如何获取客户端访问IP

其实获取IP是最简单的,因为只要有请求的话,都会存放在session里面的,只要通过下面这句话就可以拿到你所需要的IP,但是如何知道别人访问你的服务器呢,这个时候就需要您自己去写一个监听事件listen;
获取IP方式如下代码即可:

HttpSession session = request.getSession(false);
if (session == null) {
    session = request.getSession();
    System.out.println("session:" + session + "创建成功");
    session.setAttribute("ip", request.getRemoteAddr());
    System.out.println("----访问的IP是:"+request.getRemoteAddr()+"----");
}

控制台输出:
【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)

2、如何通过IP获取归属地(离线+在线)

通过上面的方式拿到了IP地址,那么我想知道是哪些地方的人访问了我们的系统的话这就需要后台去进行查询了,这才是这篇文章的核心:

2.1 离线模式

主要是通过自己本地的离线库来实现查找的,有个弊端就是需要不断的更新。

第一步:下载离线包ip2region.xdb

首先下载一个离线的IP归属映射包ip2region.xdb,没有的可以去我的百度云盘上下载
下载地址如下:
链接:https://pan.baidu.com/s/1l_Gfhl0TVPYXvpK9QSiXyw
提取码:hdd6

第二步:引入离线包

将我们的离线包放在resources目录下,如下图所示:
【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)
Maven引入

打开项目中的pom.xml文件,将下面的代码复制到里面去(如果有则忽略):

<!-- ip2region  -->
    <dependency>
      <groupId>org.lionsoul</groupId>
      <artifactId>ip2region</artifactId>
      <version>2.6.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.9</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.5</version>
    </dependency>

开始引入时候可能会报红,需要你自己去更新一下maven库
【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)
没有报红表示本地引入成功。

Pom.xml引入静态打包(特别关键,不然会报错)
[Xxx/ip2region.xdb] cannot be opened because it does not exist

<resource>
  <directory>src/main/resources</directory>
  <includes>
    <include>jdbc.properties</include>
    <include>*.xml</include>
    <include>ipdb/*.xdb</include>
  </includes>
</resource>

主要是在构建的时候我们java会变成class文件进行编译,一些静态资源需要自己手动去加才能打到jar包里面去。

第三步:代码实现

控制台效果如下所示(国内国外的都有):
【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)
核心实现代码(记得要引入一些依赖包哟):

String dbPath = "/ipdb/ip2region.xdb";
try {
    InputStream inputStream = new ClassPathResource(dbPath).getInputStream();
    byte[] dbBinStr = FileCopyUtils.copyToByteArray(inputStream);
    // 创建一个完全基于内存的查询对象
    searcher = Searcher.newWithBuffer(dbBinStr);
} catch (Exception e) {
    System.out.printf("failed to create content cached searcher: %s\n", e);
}
//把ip2r
String address = "";
try {
    address = searcher.search("66.249.79.193");
} catch (Exception e) {
    throw new RuntimeException(e);
}
System.out.println("=== 访问者的地址为:"+address+" === ");

到这里我们就只要维护好那个离线包文件就可以,定时更新一下。

2.2 在线模式

主要通过别人或者官网提供的API接口去实现查询的功能,有个弊端就是特别依赖别人的服务器,万一别人服务器挂了就访问不了了。
具体实现效果和2.1离线模式介绍的一样
【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)
主要实现我封装到一个java类里面,写了一些特定的方法;
如下所示:

public static String getAddress(String ip) {
    try {
        URL realUrl = new URL("http://whois.pconline.com.cn/ipJson.jsp?ip=" + ip + "&json=true");
        HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
        conn.setRequestMethod("GET");
        conn.setUseCaches(false);
        conn.setReadTimeout(6000);
        conn.setConnectTimeout(6000);
        conn.setInstanceFollowRedirects(false);
        int code = conn.getResponseCode();
        StringBuilder sb = new StringBuilder();
        String ipaddr = "";
        if (code == 200) {
            InputStream in = conn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            ipaddr = ip + "=" + sb.substring(sb.indexOf("addr") + 7, sb.indexOf("regionNames") - 3);
        }
        return ipaddr;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

调用地方如下所示:

String address = IpAddressUtils.getAddress("66.249.79.193");
System.out.println("=== (在线)访问者的地址为:"+address+" === ");

3、推荐方式,先离线后在线

【重要】其实我们可以结合两个使用一起,先采用离线,如果发现为null的话则调用在线查询的方式。这样在一定的程度上能够保证数据的完整性,都有不足的话就互补一下;如下所示逻辑:

System.out.println("--- (在线+离线)访问者的IP为:66.249.79.193 --- ");
        //================离线模式获取=start====================//
        String dbPath = "/ipdb/ip2region.xdb";
        try {
            InputStream inputStream = new ClassPathResource(dbPath).getInputStream();
            byte[] dbBinStr = FileCopyUtils.copyToByteArray(inputStream);
            // 创建一个完全基于内存的查询对象
            searcher = Searcher.newWithBuffer(dbBinStr);
        } catch (Exception e) {
            System.out.printf("failed to create content cached searcher: %s\n", e);
        }
        //把ip2r
        String address = "";
        try {
            address = searcher.search("221.231.220.212");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
//        String address = IpAddressUtils.getCityInfo("66.249.79.193");
        System.out.println("=== (离线)访问者的地址为:"+address+" === ");
        //================离线模式获取=end====================//
        //======================在线模式获取 start========================//
        if("".equals(address)){
            address = IpAddressUtils.getAddress("66.249.79.193");
            System.out.println("=== (在线)访问者的地址为:"+address+" === ");
        }
        //======================在线模式获取 end========================//

4、彩蛋

如果觉得这篇文章对您有帮助的话,想支持博主的可以上皇榜看看哟,皇榜点击此处进入文章来源地址https://www.toymoban.com/news/detail-423939.html

到了这里,关于【获取IP归属地】Java如何实现通过IP获取IP归属地 [离线+在线](附代码,2023年亲测有效)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 教你如何实现IP归属地功能

           随着网络的发展先在抖音、知乎、快手、小红书等这些平台已经上线了“网络用户显示 IP 的功能”,境外用户显示的是国家,国内的用户显示的省份,而且此项显示无法关闭,归属地强制显示。今天这篇文章,就用几分钟的时间来讲述一下这个功能是怎么实现的。

    2024年01月20日
    浏览(63)
  • java实现通过IP地址获取mac(物理地址)

    java实现通过IP地址获取mac(物理地址),只能获取到局域网的mac地址,具体代码如下:

    2024年02月16日
    浏览(50)
  • IP获取归属地区(免费)

    使用 http://whois.pconline.com.cn/ipJson.jsp 这个 URL 来获取 IP 地址的归属城市信息

    2024年02月16日
    浏览(43)
  • 使用 ip2region 获取用户的 IP 归属地

    ip2region 是一个离线IP地址定位库和IP定位数据管理框架,能实现10微秒级别的查询效率,提供了众多主流编程语言的xdb数据生成和查询客户端实现。 每个 ip 数据段的 region 信息都固定了格式: 国家|区域|省份|城市|ISP ,只有中国的数据绝大部分精确到了城市,其他国家部分数

    2024年02月13日
    浏览(50)
  • 使用java代码实现BacNet协议通过设备IP与设备ID同网段获取到对方设备数据

    本文章参考了很多博主的案列 收获很多很感谢他们 我把他们的文章标注出来 可能我的方法并不适合你 使用感兴趣伙伴们可以的效仿他们的一下 (13条消息) BacNet4j-跨网段-项目运用_森林猿的博客-CSDN博客 (13条消息) BACnet/IP之BACnet4j学习java代码例子属性读写01_夢_殤的博客-CSDN博

    2024年02月05日
    浏览(42)
  • 如何高效地查询IP归属地

    高效识别IP归属地是网络安全领域中的一项重要工作。准确地识别IP的归属地不仅可以帮助网络管理员追踪和定位潜在的网络攻击者,还可以用于网络流量分析、地理定位服务等方面。  以下将介绍几种高效识别IP归属地的方法。 使用IP归属地数据库 IP归属地数据库是一种存储

    2024年02月15日
    浏览(49)
  • 如何通过美国多IP服务器优化大规模在线媒体传输?

    在数字化时代,随着视频内容消费的持续增长,如何有效地传输大规模在线媒体成为了许多企业面临的挑战。美国多IP服务器的配置提供了一种有效的解决方案,不仅可以提高传输效率,还能优化用户体验。通过合理配置和管理美国多IP服务器,可以确保视频内容的高效分发和

    2024年04月27日
    浏览(49)
  • API接口:如何通过使用手机归属地查询

     随着手机普及率的不断增加,手机号码的信息查询也成为了一个非常实用的功能。本文将介绍如何通过使用手机归属地查询API接口实现查询手机号码所在地的功能。 首先,我们需要一个可以查询手机号码所在地的API接口。目前市面上有很多免费或付费的API接口可供选择,如

    2024年02月15日
    浏览(55)
  • Java-通过IP获取真实地址

    最近写了一个日志系统,需要通过访问的 IP 地址来获取真实的地址,并且存到数据库中,我也是在网上看了一些文章,遂即整理了一下供大家参考。 这个是获取正确 IP 地址的方法,可以直接使用的。 通过以上方法你可以获取到访问者的 IP 地址,只有获取到了 IP 地址,才能

    2024年02月15日
    浏览(51)
  • SpringBoot如何通过Nginx代理获取真实IP

    springboot作为后台代码,获取到的登录IP是前台的代理服务器地址,并不是用户的真实IP地址,让我们在做统计的时候无从下手。下面是一个后台获取IP地址的类,本质上没有什么问题,问题在于,Nginx给你的就是一个代理之后的地址,所以你当然获取不到真实的地址了。 那么如

    2024年01月17日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包