java通过IP解析地理位置


文章目录

  • java通过IP解析地理位置
    • 一、获取IP地址
    • 二、百度普通IP定位API获取地理位置

在项目开发中,需要在登录日志或者操作日志中记录客户端ip所在的地理位置。目前根据ip定位地理位置的第三方api有好几个,淘宝、新浪、百度等,这三种其实也有些缺点的:淘宝,开始几次可以成功根据ip获取对应地理位置,但后面就莫名其妙开始不行,直接通过浏览器获取又可以;新浪,之前一直可以,但最近不知道为什么不行了,访问直接报错(可能api修改了或者取消了吧);百度,需要申请百度地图开发者平台的开发者账号,请求时接口中需要加上百度提供的秘钥等信息,好像不能定位国外的ip,但是针对国内的可以使用。在此整理一下,便于后期使用。

百度Web服务API-普通IP定位:http://lbsyun.baidu.com/index.php?title=webapi/ip-api

根据以上使用指南,注册百度账号,成为地图开放平台开发者,获取密钥(AK),根据服务文档使用。

一、获取IP地址

java IP地址工具类,java IP地址获取,java获取客户端IP地址

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;import javax.servlet.http.HttpServletRequest;public class IpUtils {private static final String[] HEADERS = { "X-Forwarded-For","Proxy-Client-IP","WL-Proxy-Client-IP","HTTP_X_FORWARDED_FOR","HTTP_X_FORWARDED","HTTP_X_CLUSTER_CLIENT_IP","HTTP_CLIENT_IP","HTTP_FORWARDED_FOR","HTTP_FORWARDED","HTTP_VIA","REMOTE_ADDR","X-Real-IP"};/*** 判断ip是否为空,空返回true* @param ip* @return*/public static boolean isEmptyIp(final String ip){return (ip == null || ip.length() == 0 || ip.trim().equals("") || "unknown".equalsIgnoreCase(ip));}/*** 判断ip是否不为空,不为空返回true* @param ip* @return*/public static boolean isNotEmptyIp(final String ip){return !isEmptyIp(ip);}/**** 获取客户端ip地址(可以穿透代理)* @param request HttpServletRequest* @return*/public static String getIpAddress(HttpServletRequest request) {String ip = "";for (String header : HEADERS) {ip = request.getHeader(header);if(isNotEmptyIp(ip)) {break;}}if(isEmptyIp(ip)){ip = request.getRemoteAddr();}if(isNotEmptyIp(ip) && ip.contains(",")){ip = ip.split(",")[0];}if("0:0:0:0:0:0:0:1".equals(ip)){ip = "127.0.0.1";}return ip;}/*** 获取本机的局域网ip地址,兼容Linux* @return String* @throws Exception*/public String getLocalHostIP() throws Exception{Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces();String localHostAddress = "";while(allNetInterfaces.hasMoreElements()){NetworkInterface networkInterface = allNetInterfaces.nextElement();Enumeration<InetAddress> address = networkInterface.getInetAddresses();while(address.hasMoreElements()){InetAddress inetAddress = address.nextElement();if(inetAddress != null && inetAddress instanceof Inet4Address){localHostAddress = inetAddress.getHostAddress();}}}return localHostAddress;}
}

二、百度普通IP定位API获取地理位置

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;import org.json.JSONException;
import org.json.JSONObject;public class Ip2LocationViaBaidu {/*** 根据IP查询地理位置* @param ip*            查询的地址* @return status*                0:正常*                1:API查询失败*               2:API返回数据不完整* @throws IOException* @throws JSONException*/public static Object[] getLocation(String ip) throws IOException, JSONException {String lng = null;// 经度String lat = null;// 纬度String province=null;//省String city = null;// 城市名String status = "0";// 成功String ipString = null;String jsonData = ""; // 请求服务器返回的json字符串数据try {ipString = java.net.URLEncoder.encode(ip, "UTF-8");} catch (UnsupportedEncodingException e1) {e1.printStackTrace();}/** 请求URLhttp://api.map.baidu.com/location/ip?ak=您的AK&ip=您的IP&coor=bd09ll //HTTP协议 https://api.map.baidu.com/location/ip?ak=您的AK&ip=您的IP&coor=bd09ll //HTTPS协议*/String key = "*************";// 百度密钥(AK),此处换成自己的AKString url = String.format("https://api.map.baidu.com/location/ip?ak=%s&ip=%s&coor=bd09ll", key, ipString);// 百度普通IP定位APIURL myURL = null;URLConnection httpsConn = null;try {myURL = new URL(url);} catch (MalformedURLException e) {e.printStackTrace();}InputStreamReader insr = null;BufferedReader br = null;try {httpsConn = (URLConnection) myURL.openConnection();// 不使用代理if (httpsConn != null) {insr = new InputStreamReader(httpsConn.getInputStream(), "UTF-8");br = new BufferedReader(insr);String data = null;int count = 1;while ((data = br.readLine()) != null) {jsonData += data;}JSONObject jsonObj = new JSONObject(jsonData);if ("0".equals(jsonObj.getString("status"))) {province = jsonObj.getJSONObject("content").getJSONObject("address_detail").getString("province");city = jsonObj.getJSONObject("content").getJSONObject("address_detail").getString("city");lng = jsonObj.getJSONObject("content").getJSONObject("point").getString("x");lat = jsonObj.getJSONObject("content").getJSONObject("point").getString("y");if (city.isEmpty() || lng.isEmpty() || lat.isEmpty()) {status = "2";// API返回数据不完整}} else {status = "1";// API查询失败}}} catch (IOException e) {e.printStackTrace();} finally {if (insr != null) {insr.close();}if (br != null) {br.close();}}return new Object[] { status, province, city, lng, lat };}
}

把上边的百度密钥换成你自己的,下边是API返回的json数据格式。

{  address: "CN|北京|北京|None|CHINANET|1|None",    #地址  content:    #详细内容  {  address: "北京市",    #简要地址  address_detail:    #详细地址信息  {  city: "北京市",    #城市  city_code: 131,    #百度城市代码  district: "",    #区县  province: "北京市",    #省份  street: "",    #街道  street_number: ""    #门址  },  point:    #当前城市中心点  {  x: "116.39564504",  y: "39.92998578"  }  },  status: 0    #返回状态码
}

回到顶部


java通过IP解析地理位置相关推荐

  1. java根据ip定位地理位置

    在项目开发中,我们可能会遇到这样的需求:需要在登录日志或者操作日志中记录客户端ip所在的地理位置.目前根据ip定位地理位置的第三方api有好几个,淘宝.新浪.百度等,这三种其实也有些缺点的:淘宝,开始 ...

  2. hive UDF 根据ip解析地理位置信息

    hive UDF 根据ip查询对应地理位置信息 hive UDF 根据ip查询对应地理位置信息 具体实现 源码 hive UDF 根据ip查询对应地理位置信息 最终效果 具体可返回信息:洲,国家,省, ...

  3. 通过百度普通IP定位API获取IP的地理位置java根据ip定位地理位置

    在项目开发中,需要在登录日志或者操作日志中记录客户端ip所在的地理位置.目前根据ip定位地理位置的第三方api有好几个,淘宝.新浪.百度等,这三种其实也有些缺点的:淘宝,开始几次可以成功根据ip获取对 ...

  4. java获取用户ip_Java获取用户访问IP及地理位置的方法详解

    本文实例讲述了Java获取用户访问IP及地理位置的方法.分享给大家供大家参考,具体如下: 获取用户访问的IP地址 /** * 获取用户ip地址 * @return */ public static S ...

  5. 在线IP到地理位置解析的API接口,IP到地理位置、所属组织名、AS号、域名反查

    有的时候,我们有IP到地理位置.组织名.AS号.域名反向解析的需求,这些IP属性信息对于网络测量统计很有帮助. 如下是本人在日常科研中遇到的免费.可用api. 1. ip-api: 方法: url: ...

  6. Java 通过经纬度获取地理位置

    开发工具与关键技术:Eclipse 下面我们使用java来获取经纬度地理位置,下面我们来看代码,首先我们要获取腾讯地图的key 然后用GET请求获取地理解析结果. 截图: 我们现在写一个主方法测试一下 ...

  7. Java 面试知识点解析(五)——网络协议篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  8. Java TCP/IP Socket 编程 笔记

    http://jimmee.iteye.com/blog/617110 http://jimmee.iteye.com/category/93740 Java TCP/IP Socket 编程 笔记( ...

  9. java获取IP地址和MAC地址方式

    java获取IP地址和MAC地址方式 前端和后台都可以获取 ip获取方式比较简单,就不做分析了,主要说mac的获取 前端获取的方式与局限性:尝试好几种方式,这种是最易实现.最简单的方式,确实能获取该浏 ...

最新文章

  1. LeetCode中等题之最简分数
  2. 比特币现金(BCH)是5月的货币之王
  3. webpack自动打包功能配置
  4. mongodb 安装与卸载
  5. Java默认类型,类型转换,常量与变量笔记
  6. CSAPP--整数的表示
  7. java复制一个对象_Java中对象的复制
  8. 监督学习 | 线性回归 之多元线性回归原理及Sklearn实现
  9. mysql 占比函数_MYSQL 八大优化方案
  10. Oracle学习技巧
  11. wps for linux字体缺失,wps for linux 字体库缺失问题的解决办法
  12. 新浪(1998年12月—2000年3月)
  13. Webpack的使用——进阶篇
  14. 发现个不错的网盘类似百度云盘 支持磁力云预览,离线下载 20G
  15. vue 全局刷新与局部刷新
  16. 对批处理、多道操作系统的理解
  17. 如何从照片中提取文字?
  18. python界面设计资源库_python界面ui设计图-python界面ui设计模板-千库网
  19. 图像篡改数据集CASIA 1.0分享 001
  20. GIT - 解决冲突

热门文章

  1. 面试三 去苏州了 2023.6.13 苏州一上市公司
  2. C语言东方博宜oj 1077
  3. 多肽修饰PNA肽核酸Bz-D-Phe-Val-Arg-pNA|L-Phe-Val-Arg-pNA
  4. 【opencv安装和配置完整版教程】(win10+vs2019+opencv4.4.0+opencv_contrib-4.4.0+永久配置)
  5. 马云说要用AI赋能产业,最强黄牛党先应用上了。。。那么问题来了,春节你还回得了家吗?...
  6. Arrow 之 list
  7. 动手制作属于你自己的WIN PE3.0
  8. 凯叔讲故事显示无法连接服务器,【凯叔讲故事】151.苏菲的杰作(重发视频链接修复版)...
  9. 表现仍专业,价格更亲民:新华三NX54无线路由器评测体验
  10. CTFHub | UA注入