<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在專案開發中,需要在登入紀錄檔或者操作紀錄檔中記錄使用者端ip所在的地理位置。
目前根據ip定位地理位置的第三方api有好幾個,淘寶、新浪、百度等,這三種其實也有些缺點的:
在此整理一下,便於後期使用。
百度Web服務API-普通IP定位:http://lbsyun.baidu.com/index.php?title=webapi/ip-api
根據以上使用指南,註冊百度賬號,成為地圖開放平臺開發者,獲取金鑰(AK),根據服務檔案使用。
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; } }
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 #返回狀態碼 }
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=湖州市)
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45