中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java怎么通過IP解析地理位置

發布時間:2023-02-14 09:21:37 來源:億速云 閱讀:157 作者:iii 欄目:開發技術

這篇文章主要講解了“java怎么通過IP解析地理位置”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java怎么通過IP解析地理位置”吧!

    java通過IP解析地理位置

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

    目前根據ip定位地理位置的第三方api有好幾個,淘寶、新浪、百度等,這三種其實也有些缺點的:

    • 淘寶,開始幾次可以成功根據ip獲取對應地理位置,但后面就莫名其妙開始不行,直接通過瀏覽器獲取又可以;

    • 新浪,之前一直可以,但最近不知道為什么不行了,訪問直接報錯(可能api修改了或者取消了吧);

    • 百度,需要申請百度地圖開發者平臺的開發者賬號,請求時接口中需要加上百度提供的秘鑰等信息,好像不能定位國外的ip,但是針對國內的可以使用。

    獲取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();
    		}
    		
    	    /*
    	     * 請求URL
    	    	http://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),此處換成自己的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;
     
     
    /**
     * @author tqf
     * @Description 根據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地址
         * 如果使用了多級反向代理的話,X-Forwarded-For的值并不止一個,而是一串IP地址,X-Forwarded-For中第一個非unknown的有效IP字符串,則為真實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);
            }
     
            //使用代理,則獲取第一個IP地址
            if(StringUtils.isEmpty(ip) ) {
                if(ip.indexOf(",") > 0) {
                    ip = ip.substring(0, ip.indexOf(","));
                }
            }
     
            return ip;
        }
     
        /**
         * 根據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、測試結果

    測試ip:36.25.225.250

    返回數據:

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

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

    java怎么通過IP解析地理位置

    感謝各位的閱讀,以上就是“java怎么通過IP解析地理位置”的內容了,經過本文的學習后,相信大家對java怎么通過IP解析地理位置這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    凭祥市| 桃园市| 八宿县| 温州市| 隆化县| 大城县| 修文县| 崇阳县| 镇雄县| 五河县| 绥阳县| 晋城| 莲花县| 民勤县| 西藏| 伊川县| 咸丰县| 大埔县| 安化县| 荥经县| 百色市| 罗平县| 海口市| 获嘉县| 民县| 砀山县| 莲花县| 满城县| 涿州市| 双柏县| 辉县市| 涞源县| 广东省| 上杭县| 格尔木市| 洪雅县| 大宁县| 固原市| 岢岚县| 永安市| 天全县|