Java如何根据IP获取当前定位
当今购物、旅游等服务型的网站如此流行,我们有时候也会碰到这样网站的开发。
在开发此类网站时,为了增加用户的体验感受,我们不得不在用户刚进入网站时定位到用户所在地,
更好的为用户推荐当地产品。比如去哪儿,携程,美团等都会有定位功能。
那么我们怎样“贴心”的为用户定位呢?
1.首先我们需要先获取本机的外网ip
/**
* 得到本机的外网ip,出现异常时返回空串""
* @return
*/
public static String getPublicIP() {
String ip = "";
org.jsoup.nodes.Document doc = null;
Connection con = null;
con = Jsoup.connect("http://www.ip138.com/ip2city.asp").timeout(10000);
try {
doc = con.get();
// 获得包含本机ip的文本串:您的IP是:[xxx.xxx.xxx.xxx]
org.jsoup.select.Elements els = doc.body().select("center");
for (org.jsoup.nodes.Element el : els) {
ip = el.text();
}
// 从文本串过滤出ip,用正则表达式将非数字和.替换成空串""
ip = ip.replaceAll("[^0-9.]", "");
} catch (IOException e) {
e.printStackTrace();
}
return ip;
}
2.定义一个方法,将字符拼接成字符串
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
3.将URL资源解析成json对象
public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
InputStream is = null;
try {
is = new URL(url).openStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
} finally {
//关闭输入流
is.close();
}
}
4.获取当地地址名,这个可以根据自己的具体需求更改。参数ak后面的值是ip定位api服务的密钥,
这个可以自己去百度申请,详见 http://api.map.baidu.com/lbsapi/cloud/ip-location-api.htm
public static String getAddrName() throws JSONException, IOException{
//这里调用百度的ip定位api服务 详见 http://api.map.baidu.com/lbsapi/cloud/ip-location-api.htm
JSONObject json = readJsonFromUrl("http://api.map.baidu.com/location/ip?ak=iTrwV0ddxeFT6QUziPQh2wgGofxmWkmg&ip="+getPublicIP());
/* 获取到的json对象:
* {"address":"CN|河北|保定|None|UNICOM|0|0",
* "content":{"address_detail":{"province":"河北省","city":"保定市","street":"","district":"","street_number":"","city_code":307},
* "address":"河北省保定市","point":{"x":"12856963.35","y":"4678360.5"}},
* "status":0}
*/
//这里我们可以输出json看一下具体格式
System.out.println(json.toString());
JSONObject content=json.getJSONObject("content"); //获取json对象里的content对象
JSONObject addr_detail=content.getJSONObject("address_detail");//从content对象里获取address_detail
String city=addr_detail.get("city").toString(); //获取市名,可以根据具体需求更改,如果需要获取省份的名字,可以把“city”改成“province”...
return city;
}
5.这里我们写一个主方法方便于测试
public static void main(String[] args) throws IOException, JSONException {
System.out.println(getAddrName());
}
运行结果:

Java如何根据IP获取当前定位的更多相关文章
- Java实现通过IP获取域名,通过域名获取IP
一.通过Linux命令实现 ping www.baidu.com nslookup www.baidu.com nslookup 14.215.177.166 为什么这个命令会有一个192.168.1 ...
- java根据本地Ip获取mac地址
import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; impo ...
- thinkphp IP获取和定位
系统内置了get_client_ip方法用于获取客户端的IP地址,使用示例: $ip = get_client_ip(); 如果要支持IP定位功能,需要使用扩展类库Org\Net\IpLocation ...
- Java使用纯真IP库获取IP对应省份和城市
原文:http://blog.csdn.net/chwshuang/article/details/78027873?locationNum=10&fps=1 Java使用纯真IP库获取IP对 ...
- java 通过ip获取客户端mac地址
java 通过ip获取客户端mac地址 package com.asppro.util; import java.io.BufferedReader; import java.io.IOExcepti ...
- Java 根据IP获取地址
用淘宝接口:(源码:java 根据IP地址获取地理位置) pom.xml: <!-- https://mvnrepository.com/artifact/net.sourceforge.jre ...
- Java Web应用中获取用户请求相关信息,如:IP地址、操作系统、浏览器等信息
引入jar包 <dependency> <groupId>eu.bitwalker</groupId> <artifactId>UserAgentUti ...
- JAVA从本机获取IP地址
JAVA从本机获取IP地址 论述: 此篇博客是在工作的时候,需要获得当前网络下面正确的ip地址,在网上查阅很多博客,网上一个比较普遍的说法是通过InetAddress.getLocalHost().g ...
- Java 工具类 IpUtil - 获取本机所有 IP 地址,LocalHost 对应地址 IP
Java 工具类 IpUtil - 获取本机所有 IP 地址,LocalHost 对应地址 IP IP 工具类 源代码: /** * <p> * * @author XiaoPengwei ...
随机推荐
- [译]内存中的Java数组是怎么样的
(文章翻译自What does a Java array look like in memory?) Java中的数组存储了两个中的一个类型:原始类型的类或则是引用类型(比如指针) 当一个对象通过Ne ...
- solrnet的使用
solr与.net系列课程(五)solrnet的使用 solr与.net系列课程(五)solrnet的使用 最近因项目比较忙,所以这篇文章出的比较晚,离上一篇文章已经有半个月的时间了,这节课我们 ...
- WINHTTP的API接口说明
BOOL WINAPI WinHttpAddRequestHeaders( _In_ HINTERNET hRequest, _In_ LPCWSTR pwszHeaders, _In ...
- How to write own add-in for SSMS 2012 (Final release version)
原文 How to write own add-in for SSMS 2012 (Final release version) Reading internet forums I have noti ...
- nginx启动,重启,关闭命令
nginx启动,重启,关闭命令 停止操作停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的步骤1:查询nginx主进程号ps -ef | grep nginx在进程列表 ...
- iOS基础 - UIWebView
一.UIWebView简介 是iOS内置的浏览器控件,可以浏览网页.打开文档等 能够加载html/htm.pdf.docx.txt等格式的文件 系统自带的Safari浏览器就是通过UIWebView实 ...
- 编写高质量equals方法
什么是equals方法 指示其他某个对象是否与此对象相等,equals方法存在Object类中,我们编写的类继承Object,可以覆盖Object的equals方法来实现我们的逻辑,去判断两个对象是否 ...
- 在win下,如何用bat看程序运行的时间
上网搜了下用bat记录程序运行时间的方法,结果连google跳出的都是些什么ctime啥的- - 一点都不靠谱 傍晚问了几个大神,也大多都是ctime党,不过还好明哲造![跪跪跪] 在此mark 就比 ...
- 大数据时代,我们为什么使用hadoop
大数据时代,我们为什么使用hadoop 我们先来看看大数据时代, 什么叫大数据,“大”,说的并不仅是数据的“多”!不能用数据到了多少TB ,多少PB 来说. 对于大数据,可以用四个词来表示:大量,多样 ...
- C/C++基础知识总结——数组、指针域、字符串
1. 数组 1.1 数组作为函数参数 (1) 如果使用数组作为函数的参数,则实参和形参都是数组名,且类型要相同.数组名做参数时传递的是地址 (2) 使用方法: void rowSum(int a[][ ...