iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java如何通过IP解析地理位置
  • 570
分享到

java如何通过IP解析地理位置

java解析IP位置java地理位置解析java IP解析位置 2023-02-13 18:02:38 570人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录java通过IP解析地理位置获取IP地址百度普通IP定位api获取地理位置java获取IP归属地(省、市)总结java通过IP解析地理位置 在项目开发中,需要在登录日志或者操作日

java通过IP解析地理位置

项目开发中,需要在登录日志或者操作日志中记录客户端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"
	};
	
	
	public static boolean isEmptyIp(final String ip){
        return (ip == null || ip.length() == 0 || ip.trim().equals("") || "unknown".equalsIgnoreCase(ip));
    }
	
	
	
	public static boolean isNotEmptyIp(final String ip){
        return !isEmptyIp(ip);
    }
	
	
    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;
    }
	
    
    
	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 {
	
	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();
		}
		
	    
		String key = "*************";// 百度密钥(AK),此处换成自己的AK
		String url = String.format("https://api.map.baidu.com/location/ip?ak=%s&ip=%s&coor=bd09ll", key, ipString);// 百度普通IP定位API
		URL 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、添加依赖

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.3</version>
</dependency>

2、工具类代码

package com.shucha.deveiface.biz.test;
 
 

 
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.itextpdf.text.log.Logger;
import com.itextpdf.text.log.LoggerFactory;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
public class iptes {
    private static Logger logger = LoggerFactory.getLogger(iptes.class);
 
    
    public static String getIpAddr(HttpServletRequest request) {
        String ip = null;
        try {
            ip = request.getHeader("x-forwarded-for");
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
        } catch (Exception e) {
            logger.error("IPUtils ERROR ", e);
        }
 
        //使用代理,则获取第一个IP地址
        if(StringUtils.isEmpty(ip) ) {
            if(ip.indexOf(",") > 0) {
                ip = ip.substring(0, ip.indexOf(","));
            }
        }
 
        return ip;
    }
 
    
    public static IpAddress getAddress(String ip) {
        String url = "http://ip.ws.126.net/ipquery?ip=" + ip;
        String str = HttpUtil.get(url);
        if(!StrUtil.hasBlank(str)){
            String substring = str.substring(str.indexOf("{"), str.indexOf("}")+1);
            JSONObject jsonObject = JSON.parseObject(substring);
            String province = jsonObject.getString("province");
            String city = jsonObject.getString("city");
            IpAddress ipAddress = new IpAddress();
            ipAddress.setProvince(province);
            ipAddress.setCity(city);
            System.out.println("ip:"+ ip + ",省份:" + province + ",城市:" + city);
            return ipAddress;
        }
        return null;
    }
 
    @Data
    public static class IpAddress{
        private String province;
        private String city;
    }
 
    public static void main(String[] args) {
        System.out.println(getAddress("36.25.225.250"));
    }
 
}

3、测试结果

测试ip:36.25.225.250

返回数据:

ip:36.25.225.250,省份:浙江省,城市:湖州市                  

iptes.IpAddress(province=浙江省, city=湖州市)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java如何通过IP解析地理位置

本文链接: https://www.lsjlt.com/news/195869.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • java如何通过IP解析地理位置
    目录java通过IP解析地理位置获取IP地址百度普通IP定位API获取地理位置java获取IP归属地(省、市)总结java通过IP解析地理位置 在项目开发中,需要在登录日志或者操作日...
    99+
    2023-02-13
    java解析IP位置 java地理位置解析 java IP解析位置
  • java怎么通过IP解析地理位置
    这篇文章主要讲解了“java怎么通过IP解析地理位置”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java怎么通过IP解析地理位置”吧!java通过IP解析地理位置在项目开发中,需要在登录日...
    99+
    2023-07-05
  • jQuery如何通过IP地址获得地理位置
    小编给大家分享一下jQuery如何通过IP地址获得地理位置,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过IP地址获得地理位置...
    99+
    2024-04-02
  • python分析ip地理位置
    #!/usr/bin/env python #coding=utf8 ################################ # 通过ip138判断ip所在地区 #            ...
    99+
    2023-01-31
    地理位置 python ip
  • 如何使用vbs查询IP地理位置
    这篇文章给大家分享的是有关如何使用vbs查询IP地理位置的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。msg="请输入你要查询的IP或域名:"  IP=Inputbox(msg,&q...
    99+
    2023-06-08
  • java实现通过IP地址获取mac(物理地址)
    java实现通过IP地址获取mac(物理地址),只能获取到局域网的mac地址,具体代码如下: package com.qcmsa.util;import org.apache.commons.log...
    99+
    2023-09-01
    java tcp/ip macos
  • Java输出通过InetAddress获得的IP地址数组详细解析
    使用 InetAddress 获取 IP 地址会得到一个 byte 数组如果你直接输出这个数组,你会发现 IP 地址中的某些位变成了负数比如 61.135.169.105 会输出成 ...
    99+
    2022-11-15
    Java InetAddress
  • 详解Java如何通过Socket实现查询IP
    目录背景使用示例应用例子应用服务器获取客户端的IP地址向客户端发送消息测试应用程序建立一个客户端应用程序运行应用程序在后台发生了什么总结在本文中,我们来学习下如何找到连接到服务器的客...
    99+
    2024-04-02
  • 如何通过php接口和ECharts生成基于地理位置的统计图
    如何通过PHP接口和ECharts生成基于地理位置的统计图在数据可视化领域,ECharts已经成为了一种非常流行的图表库,而PHP作为一种常用的后端开发语言,也经常用于数据处理和接口开发。本文将介绍如何使用PHP接口和ECharts库生成基...
    99+
    2023-12-17
    echarts PHP接口 地理统计图
  • JavaScript如何定位当前的地理位置
    这篇文章将为大家详细讲解有关JavaScript如何定位当前的地理位置,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下<!DOCTYPE htm...
    99+
    2024-04-02
  • Redis高效检索地理位置的原理解析
    Redis GEO 用做存储地理位置信息,并对存储的信息进行操作。通过geo相关的命令,可以很容易在redis中存储和使用经纬度坐标信息。Redis中提供的Geo命令有如下几个: ...
    99+
    2024-04-02
  • 如何通过索引优化PHP与MySQL的地理位置查询和范围查询?
    摘要:地理位置查询和范围查询是许多应用程序中常见的查询操作。本文将介绍如何使用索引优化PHP与MySQL的地理位置查询和范围查询,通过减少查询时间提高应用程序的性能。同时,还将提供具体的代码示例以供参考。引言:在许多应用程序中,地理位置查询...
    99+
    2023-10-21
    MySQL 优化 PHP 索引 地理位置
  • 如何解析网卡配置静态Ubuntu IP地址
    这篇文章主要为大家展示了“如何解析网卡配置静态Ubuntu IP地址”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解析网卡配置静态Ubuntu IP地址”这篇文章吧。Ubuntu IP经过长...
    99+
    2023-06-16
  • 如何通过http代理ip获取流量
    本篇内容主要讲解“如何通过http代理ip获取流量”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何通过http代理ip获取流量”吧!如今,http代理在大家的身边应用是很多的,下面就给大家详细...
    99+
    2023-06-20
  • js实现PC端根据IP定位当前城市地理位置的示例分析
    这篇文章将为大家详细讲解有关js实现PC端根据IP定位当前城市地理位置的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。<script type=&...
    99+
    2024-04-02
  • 如何通过索引提升PHP与MySQL的地理位置查询和分页查询的效率?
    在开发Web应用程序时,经常会遇到需要进行地理位置查询和分页查询的需求。由于数据量的增加和查询复杂性的提升,这些查询操作可能会变得越来越慢。为了提升查询效率,我们可以使用索引来优化查询,特别是对于PHP与MySQL的地理位置查询和分页查询。...
    99+
    2023-10-21
    MySQL PHP 索引
  • 如何通过UltraEdit解析BMP文件内部结构(BMP位图基础)
    目录初见位图位图文件的基本结构1.文件头信息块2.图像描述信息块3.颜色表4.图像数据区具体例子初见位图 我们先打开画图随便画一幅图并采用24位bmp图像格式保存,就得到了一张24位...
    99+
    2024-04-02
  • vue在手机中如何通过本机IP地址访问webApp
    小编给大家分享一下vue在手机中如何通过本机IP地址访问webApp,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vue中通过l...
    99+
    2024-04-02
  • 如何设置代理ip服务器地址
    目录 前言 一、使用HTTP代理服务器 1. Python代码 2. Java代码 二、使用SOCKS代理服务器 1. Python代码 2. Java代码 三、使用代理池 1. Python代码 2. Java代码 总结 前言 代理服...
    99+
    2023-09-22
    tcp/ip 服务器 网络协议 网络
  • IP地址如何自动设置批处理
    这篇文章主要介绍了IP地址如何自动设置批处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作