首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java服务端获取IP及归属地查询

Java服务端获取IP及归属地查询

作者头像
码客说
发布2022-12-03 12:51:18
发布2022-12-03 12:51:18
1.2K00
代码可运行
举报
文章被收录于专栏:码客码客
运行总次数:0
代码可运行

获取请求的IP

代码语言:javascript
代码运行次数:0
运行
复制
public String getIp(HttpServletRequest request){
  String ip = request.getHeader("x-forwarded-for");
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("Proxy-Client-IP");
  }
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("WL-Proxy-Client-IP");
  }
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("HTTP_CLIENT_IP");
  }
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getHeader("HTTP_X_FORWARDED_FOR");
  }
  if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
    ip = request.getRemoteAddr();
  }
  if(ip == null){
    return "";
  }
  String[] ipArr = ip.split(",");
  if(ipArr.length>0){
    return ipArr[0];
  }else{
    return "";
  }
}

如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?

答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。

如:

X-Forwarded-For:192.168.1.110,192.168.1.120, 192.168.1.130,192.168.1.100 用户真实IP为:192.168.1.110

获取IP的归属地

添加依赖

代码语言:javascript
代码运行次数:0
运行
复制
<dependencies>
  <dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>2.6.6</version>
  </dependency>
</dependencies>

示例代码

代码语言:javascript
代码运行次数:0
运行
复制
import org.lionsoul.ip2region.xdb.Searcher;
import java.io.*;
import java.util.concurrent.TimeUnit;

public class SearcherTest {
    public static void main(String[] args) {
        // 1、创建 searcher 对象
        String dbPath = "D:\\Project\\java\\data\\ip2region.xdb";
        Searcher searcher = null;
        try {
            searcher = Searcher.newWithFileOnly(dbPath);
        } catch (IOException e) {
            System.out.printf("failed to create searcher with `%s`: %s\n", dbPath, e);
            return;
        }

        // 2、查询
        String ip = "223.5.5.5";
        try {
            long sTime = System.nanoTime();
            String region = searcher.search(ip);
            long cost = TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() - sTime));
            System.out.printf("{region: %s, ioCount: %d, took: %d μs}\n", region, searcher.getIOCount(), cost);
        } catch (Exception e) {
            System.out.printf("failed to search(%s): %s\n", ip, e);
        }

        // 3、关闭资源
        try {
            searcher.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 备注:并发使用,每个线程需要创建一个独立的 searcher 对象单独使用。
    }
}

其中ip2region.xdb下载地址

链接:https://pan.baidu.com/s/1Uc_2kB0lFpH9rlCOQOvh0w 提取码:psvm

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获取请求的IP
  • 获取IP的归属地
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档