欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年02月13日 15:14:53   作者:GeGe&YoYo  
這篇文章主要介紹了java如何通過IP解析地理位置的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java通過IP解析地理位置

在項(xiàng)目開發(fā)中,需要在登錄日志或者操作日志中記錄客戶端ip所在的地理位置。

目前根據(jù)ip定位地理位置的第三方api有好幾個(gè),淘寶、新浪、百度等,這三種其實(shí)也有些缺點(diǎn)的:

  • 淘寶,開始幾次可以成功根據(jù)ip獲取對(duì)應(yīng)地理位置,但后面就莫名其妙開始不行,直接通過瀏覽器獲取又可以;
  • 新浪,之前一直可以,但最近不知道為什么不行了,訪問直接報(bào)錯(cuò)(可能api修改了或者取消了吧);
  • 百度,需要申請(qǐng)百度地圖開發(fā)者平臺(tái)的開發(fā)者賬號(hào),請(qǐng)求時(shí)接口中需要加上百度提供的秘鑰等信息,好像不能定位國(guó)外的ip,但是針對(duì)國(guó)內(nèi)的可以使用。

在此整理一下,便于后期使用。

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

根據(jù)以上使用指南,注冊(cè)百度賬號(hào),成為地圖開放平臺(tái)開發(fā)者,獲取密鑰(AK),根據(jù)服務(wù)文檔使用。

獲取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;
    }
	
    
    /**
	 * 獲取本機(jī)的局域網(wǎng)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 {
	/**
	 * 根據(jù)IP查詢地理位置
	 * @param ip
	 *            查詢的地址
	 * @return status
	 * 				0:正常
	 * 				1:API查詢失敗
	 * 				2:API返回?cái)?shù)據(jù)不完整
	 * @throws IOException
	 * @throws JSONException
	 */
	public static Object[] getLocation(String ip) throws IOException, JSONException {
		String lng = null;// 經(jīng)度
		String lat = null;// 緯度
		String province=null;//省
		String city = null;// 城市名
		
		
		String status = "0";// 成功
		String ipString = null;
		String jsonData = ""; // 請(qǐng)求服務(wù)器返回的json字符串?dāng)?shù)據(jù)
		
		try {
			ipString = java.net.URLEncoder.encode(ip, "UTF-8");
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		}
		
	    /*
	     * 請(qǐng)求URL
	    	http://api.map.baidu.com/location/ip?ak=您的AK&ip=您的IP&coor=bd09ll //HTTP協(xié)議 
	    	https://api.map.baidu.com/location/ip?ak=您的AK&ip=您的IP&coor=bd09ll //HTTPS協(xié)議
	    */
		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返回?cái)?shù)據(jù)不完整
					}
				} 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數(shù)據(jù)格式。

{  
    address: "CN|北京|北京|None|CHINANET|1|None",    #地址  
    content:    #詳細(xì)內(nèi)容  
    {  
        address: "北京市",    #簡(jiǎn)要地址  
        address_detail:    #詳細(xì)地址信息  
        {  
            city: "北京市",    #城市  
            city_code: 131,    #百度城市代碼  
            district: "",    #區(qū)縣  
            province: "北京市",    #省份  
            street: "",    #街道  
            street_number: ""    #門址  
        },  
        point:    #當(dāng)前城市中心點(diǎn)  
        {  
            x: "116.39564504",  
            y: "39.92998578"  
        }  
    },  
    status: 0    #返回狀態(tài)碼  
}

java獲取IP歸屬地(省、市)

1、添加依賴

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

2、工具類代碼

package com.shucha.deveiface.biz.test;
 
 
/**
 * @author tqf
 * @Description 根據(jù)ip獲取歸屬地
 * @Version 1.0
 * @since 2022-05-27 10:11
 */
 
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);
 
    /**
     * 獲取IP地址
     *
     * 使用Nginx等反向代理軟件, 則不能通過request.getRemoteAddr()獲取IP地址
     * 如果使用了多級(jí)反向代理的話,X-Forwarded-For的值并不止一個(gè),而是一串IP地址,X-Forwarded-For中第一個(gè)非unknown的有效IP字符串,則為真實(shí)IP地址
     */
    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);
        }
 
        //使用代理,則獲取第一個(gè)IP地址
        if(StringUtils.isEmpty(ip) ) {
            if(ip.indexOf(",") > 0) {
                ip = ip.substring(0, ip.indexOf(","));
            }
        }
 
        return ip;
    }
 
    /**
     * 根據(jù)ip獲取歸屬地
     * @param ip
     * @return
     */
    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、測(cè)試結(jié)果

測(cè)試ip:36.25.225.250

返回?cái)?shù)據(jù):

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

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Struts2實(shí)現(xiàn)生成動(dòng)態(tài)驗(yàn)證碼并驗(yàn)證實(shí)例代碼

    Struts2實(shí)現(xiàn)生成動(dòng)態(tài)驗(yàn)證碼并驗(yàn)證實(shí)例代碼

    這篇文章主要介紹了Struts2實(shí)現(xiàn)生成動(dòng)態(tài)驗(yàn)證碼并驗(yàn)證實(shí)例代碼的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 一文簡(jiǎn)單了解C#?中的DataSet類

    一文簡(jiǎn)單了解C#?中的DataSet類

    這篇文章主要介紹了一文簡(jiǎn)單了解C#?中的DataSet類,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • SpringBoot之為何推薦使用構(gòu)造器注入

    SpringBoot之為何推薦使用構(gòu)造器注入

    這篇文章主要介紹了SpringBoot之為何推薦使用構(gòu)造器注入問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java基于TCP協(xié)議的Socket通信

    Java基于TCP協(xié)議的Socket通信

    本文詳細(xì)講解了Java基于TCP協(xié)議的Socket通信,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Java限流實(shí)現(xiàn)的幾種方法詳解

    Java限流實(shí)現(xiàn)的幾種方法詳解

    這篇文章主要介紹了Java限流實(shí)現(xiàn)的幾種方法,通俗的說,限流就是 限制一段時(shí)間內(nèi),用戶訪問資源的次數(shù),減輕服務(wù)器壓力,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12
  • slf4j?jcl?jul?log4j1?log4j2?logback各組件系統(tǒng)日志切換

    slf4j?jcl?jul?log4j1?log4j2?logback各組件系統(tǒng)日志切換

    這篇文章主要介紹了slf4j、jcl、jul、log4j1、log4j2、logback的大總結(jié),各個(gè)組件的jar包以及目前系統(tǒng)日志需要切換實(shí)現(xiàn)方式的方法,有需要的朋友可以借鑒參考下
    2022-03-03
  • 基于SpringBoot+vue實(shí)現(xiàn)前后端數(shù)據(jù)加解密

    基于SpringBoot+vue實(shí)現(xiàn)前后端數(shù)據(jù)加解密

    這篇文章主要給大家介紹了基于SpringBoot+vue實(shí)現(xiàn)前后端數(shù)據(jù)加解密,文中有詳細(xì)的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴可以自己動(dòng)手試一試
    2023-08-08
  • 利用Java多線程技術(shù)導(dǎo)入數(shù)據(jù)到Elasticsearch的方法步驟

    利用Java多線程技術(shù)導(dǎo)入數(shù)據(jù)到Elasticsearch的方法步驟

    這篇文章主要介紹了利用Java多線程技術(shù)導(dǎo)入數(shù)據(jù)到Elasticsearch的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • java字符串的截取方法substring()代碼解析

    java字符串的截取方法substring()代碼解析

    這篇文章主要介紹了java字符串的截取方法substring()代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Ubuntu 使用Jni開發(fā)實(shí)例詳解

    Ubuntu 使用Jni開發(fā)實(shí)例詳解

    這篇文章主要介紹了Ubuntu 使用Jni開發(fā)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評(píng)論