一、获取访问IP这步很简单,但还是将代码贴出来吧,但是有一点需要注意,如果是nginx那种反向代理的,是获取不到客户端真实IP的,只能获取到nginx的代理IP,需要对nginx进行如下配置:

location / {proxy_pass http://127.0.0.1:10678;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
    /*** description 获取客户端IP** @param request* @return java.lang.String* @version 1.0*/public static String getIpAddress(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();}// 如果是多级代理,那么取第一个IP为客户端IPif (ip != null && ip.indexOf(",") != -1) {ip = ip.substring(0, ip.indexOf(",")).trim();}return ip;}

二、获取到IP以后就需要查找真实地址了,大概分为以下几步:

1、首先引入maven依赖

        <dependency><groupId>com.maxmind.geoip2</groupId><artifactId>geoip2</artifactId><version>2.6.0</version></dependency>

2、下载ip地址库:
下载地址:https://pan.baidu.com/s/1wwCUY6Ac8LF8984FgAkgvg
提取码:xm24
3、现有两种方法可以获取真实地址,第一种通过地址库查询,第二种通过ali的地域查询,这两种各有优缺点:
地址库查询:查询比较快适合批量查询,但是有的ip查询不到。
ali地域查询:大部分的ip都能查询到,但是查询很慢,适合单个查询。
我将两者整合了下,这样大部分的查询应该都是没问题的。

    /*** description 地址库查询** @param ip 地址* @return java.lang.String* @version 1.0*/public static String getRealAddress(String ip) {String result = "";try {// 加载地址库ClassPathResource resource = new ClassPathResource("GeoLite2-City.mmdb");DatabaseReader reader = new DatabaseReader.Builder(resource.getInputStream()).build();InetAddress inetAddress = InetAddress.getByName(ip);CityResponse response = reader.city(inetAddress);// 获取所在国家String country = response.getCountry().getNames().get("ja");// 库内获取不到的IP,访问ali的地域查询if (response.getSubdivisions().size() > 0) {// 获取所在省份String province = response.getSubdivisions().get(0).getNames().get("zh-CN");// 获取所在城市String city = response.getCity().getNames().get("zh-CN");city = city == null ? "" : city;result = country + province + city;} else {result = getAlibaba(ip);}} catch (Exception e) {e.printStackTrace();}return result;}
    /*** description ali地域查询** @param ip ip地址* @return java.lang.String* @version 1.0*/public static String getAlibaba(String ip) {Map map = new HashMap();map.put("ip", ip);map.put("accessKey", "alibaba-inc");String result = HttpClientUtil.post("http://ip.taobao.com/outGetIpInfo", map);Map valueMap = JSONObject.parseObject(result, Map.class);// 请求成功,解析响应数据if ("query success".equals(valueMap.get("msg"))) {Map<String, String> dataMap = (Map<String, String>) valueMap.get("data");String country = dataMap.get("country");String region = dataMap.get("region");String city = dataMap.get("city");return country + region + city;}return "";}

结果如下图:

Java如何获得IP和真实地址相关推荐

  1. Java如何通过IP获得真实地址

    今天接到个任务,客户想看到网站每天用户访问的地域分布,在网上大概查了下,没有比较适合的,仔细整理了下希望对你们有帮助. 一.获取访问IP这步很简单,但还是将代码贴出来吧,但是有一点需要注意,如果是ng ...

  2. java 根据ip获取mac地址_利用java如何根据IP获取mac地址

    利用java如何根据IP获取mac地址 发布时间:2020-11-25 15:49:42 来源:亿速云 阅读:74 作者:Leah 利用java如何根据IP获取mac地址?针对这个问题,这篇文章详细介 ...

  3. java获取视频真实地址,Java版蓝奏云真实地址获取

    Java版蓝奏云真实地址获取,支持密码文件下载 Tools.java package com.lhr; import java.io.*; import java.net.*; /** * * By ...

  4. java代码求IP和mac地址

    private static String getMACAddress() throws Exception { InetAddress ia = InetAddress.getLocalHost() ...

  5. java 根据mac地址获取ip_java根据本地IP获取mac地址的方法

    本文实例为大家分享了java根据本地IP获取mac地址的具体代码,供大家参考,具体内容如下 import java.net.InetAddress; import java.net.NetworkIn ...

  6. Java获取请求客户端的真实IP地址

    整理网友的材料,最后有源码,亲测能解决所有java获取IP真实地址的问题 整理的这里: 1.链接1 2.链接2 JSP里,获取客户端的IP地址的方法是: request.getRemoteAddr() ...

  7. Java 获取主机ip地址(ipv4)

    在java 应用中, 有时需要获取应用所在服务器的ip地址, 比如说利用Zookeeper 做动态节点上下线时. java 提供了InetAddress 类来获取主机ip地址, 但是使用的时候需要注意 ...

  8. 获取项目服务器ip,java获取服务器ip地址

    java获取服务器ip地址 内容精选 换一换 如果IP经过NAT/WAF,则只能获取到NAT/WAF转化后的IP地址,无法获取到NAT/WAF前的IP地址.如果客户端为容器,只能获取到容器所在主机的I ...

  9. java自动获取ip_java自动获取电脑ip和MAC地址

    java自动获取电脑ip和MAC地址 利用getLocalHost获得计算机名称和ip getByInetAddress可以确定一个IP地址属于哪一个网络接口,这个IP地址通过命令行参数传入 用get ...

最新文章

  1. Mysql Router 读写分离配置
  2. JQuery 选择器处理特殊字符
  3. hdu 2045(递推)
  4. 【AcWing 235. 魔法珠
  5. javascript获取浏览器客户端IP
  6. 【大学物理】毕奥萨伐尔定律
  7. leetcode51. N皇后
  8. 源码编译php mysql_linux下apache+mysql+php开发环境纯源代码编译搭建(转)
  9. CCF201409-4 最优配餐(100分)
  10. php开发我的收藏,我的收藏列表 · 老猫带你玩转ThinkPHP5 API开发 · 看云
  11. 用同一个文件流读取同一个文件两次所需要做的操作
  12. apache基本配置
  13. mysql 优化 (1)
  14. Gamesalad借QQ游戏无线平台进军中国
  15. laypage分页java例子_总结laypage.js分页插件用法
  16. Juphoon RTC年度成绩单,请查收!
  17. 3D打印技术到底有多强大?
  18. SQL数据库的存错过程中output用法
  19. Photoshop CC重磅功能发布:复杂抠图也能一键搞定
  20. Java的思考01 - 当大老板还是小老板

热门文章

  1. win7 和 linux双系统安装教程,win7和centos7双系统完美安装攻略
  2. unity编辑器之自动提示订外卖
  3. java 关闭输出流_Java OutputStream.close()关闭并释放输出流资源
  4. 郑州轻工业大学OJ1023: 大小写转换
  5. Vue中背景图片无法加载
  6. python接口测试传form-data参数
  7. C++设计模式之原型模式
  8. PHP 冒泡排序算法
  9. amcharts php,php - 使用dataloader将php / mysql数据加载到amcharts - 堆栈内存溢出
  10. Unity 2d 雷区与小怪的生成