1.前言

本来呢,想实现js定位功能,最少定位到城市,一开始,使用的是搜狐的api直接获取数据,可是,有时候搜狐不可靠,只能得到

公网ip,其他信息无用,就像这样

2.既然这样,还不如我自己请求自己的服务器,让服务器获取该请求的公网ip,然后再根据公网ip获取信息,

服务器解析请求公网IP的源码:

 1 public String getIpAddr(HttpServletRequestrequest) {
2 String ip = request.getHeader("x-forwarded-for");
3 if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
4 ip = request.getHeader("Proxy-Client-IP");
5 }
6 if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
7 ip = request.getHeader("WL-Proxy-Client-IP");
8 }
9 if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
10 ip = request.getRemoteAddr();
11 }
12 return ip;
13 }

但是,这样会对开发的过程造成麻烦,因为在机上开启服务,然后在本机网页访问测试,返回的ip地址是127.0.0.1,而同在一个局域网的机器访问的时候返回的ip是这台机器的ip地址192.168.xxx,只有当外网的客户端访问的时候,返回的ip是才是外网客户端的公网ip地址。

因此,获取公网IP的方法仍采用搜狐的api,然后再请求服务器,服务器去请求淘宝的ip接口获取ip信息,

为啥用淘宝的?因为免费呀,速度也快,ip库数据多。

3.搜狐api调用方式

1   <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
2 <%-- var returnCitySN = {"cip": "223.73.101.129", "cid": "CN", "cname": "CHINA"};--%>
3 <script>
4 //获取公网ip
5 document.write(returnCitySN["cip"]);
6 console.log(returnCitySN);
7 </script>

直接使用结果就可以

4.java调用淘宝api接口,获取公网ip信息

源码:

 1 import org.junit.Test;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.net.HttpURLConnection;
7 import java.net.MalformedURLException;
8 import java.net.URL;
9 import java.util.Map;
10
11 public class GetLocationByIP {
12
13 @Test
14 public void IpUtils(){
15 String s = ipToCountry("223.73.41.129");
16 System.out.println(s);
17 }
18
19
20 //通过公网ip获取地理信息
21 public static String ipToCountry(String ip){
22 String website="http://ip.taobao.com/service/getIpInfo.php?ip="+ip;
23 String read="";
24 URL url=null;
25 HttpURLConnection urlConnection=null;
26 BufferedReader in=null;
27 try {
28 url=new URL(website);
29 urlConnection=(HttpURLConnection)url.openConnection();
30 in=new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
31 read=in.readLine();
32 } catch (MalformedURLException e) {
33 e.printStackTrace();
34 } catch (IOException e) {
35 e.printStackTrace();
36 }finally{
37 if (in!=null){
38 try {
39 in.close();
40 } catch (IOException e) {
41 e.printStackTrace();
42 }
43 }
44 }
45 return read;
46 // Map readMap = FastJson.getJson().parse(read, Map.class);
47 // Map data = FastJson.getJson().parse(readMap.get("data").toString(), Map.class);
48 // return data.get("country").toString();
49 }
50
51
52
53 }

测试截图:

淘宝api接口有缺点,频繁请求会出现502异常:

这就让我很不爽了,可以使用其他公司的api代替,不仅仅淘宝一家有ip数据库

也可以使用太平洋网的接口,花样更多了,根据自己需要使用

api网址 :  http://whois.pconline.com.cn/

参考博客原址:  https://cloud.tencent.com/developer/article/1152362

js获取设备公网ip + 服务器根据公网ip 获取IP信息的更多相关文章

  1. ios获取设备信息总结

    1.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name;       //获取设备所有者的名 ...

  2. Uwp Windows10获取设备位置(经纬度)

    先在Package.appxmanifest中配置位置权限 2. 创建LocationManager类 using System; using System.Collections.Generic; ...

  3. Swift - 使用CoreLocation获取设备方向(真实方向,磁极方向)

    CoreLocation这个定位框架除了可以获取设备的位置数据,还可以获取设备的方向(可以用来实现指南针功能等). 1,CLHeading对象通过一组属性提供航向相关数据: magneticHeadi ...

  4. Android 开发 获取设备信息与App信息

    设备信息 设备ID(DeviceId) 获取办法 android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager ...

  5. ios 获取设备相关的信息

    .获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名称 NSStr ...

  6. Xamarin.Forms获取设备屏幕大小

    Xamarin.Forms获取设备屏幕大小 可以借助device.Display获取.基本形式如下: var display = device.Display;然后就可以获取屏幕大小.display. ...

  7. 没有公网IP的服务器如何通过有公网的服务器实现远程管理的功能?即VPN服务器搭建过程

    由于很多PPPoE帐号都没有公网IP了,那我们如何实现远程管理呢? 答案是比较简单的,首先,你要拥有一台有公网IP的路由器,其他品牌的也可以,但是下面我以WayOs作为VPN服务器,给大家一个教程. ...

  8. python获取公网ip,本地ip及所在国家城市等相关信息收藏

    python获取公网ip的几种方式       from urllib2 import urlopen   my_ip = urlopen('http://ip.42.pl/raw').read() ...

  9. java获取客户端请求IP地址(公网ip)

    之前写了一个获取ip地址的方法,但是放网上一查显示此Ip地址是局域网ip地址,要是想获取请求端的真实公网ip地址怎么样了,看了一些别人的博客后发现,想要获取客户端的公网ip必须借助第三方. packa ...

随机推荐

  1. Tomcat简单介绍

    1.目录结构 在conf文件夹中修改了配置之后一定要重启Tomcat

  2. Lock 锁的实现

    锁的种类 自旋锁(spinlock):无法获得锁,就一直循环获取,适合短时间的加锁 睡眠锁(sleeplock):为了防止长时间的循环等待,在获取不到锁时,进程陷入睡眠,当锁释放时对睡眠进程进行唤醒 ...

  3. DevOps的分与合

    一.抽象的 DevOps DevOps 是使软件开发和 IT 团队之间的流程自动化的一组实践,以便他们可以更快,更可靠地构建,测试和发布软件.DevOps 的概念建立在建立团队之间协作文化的基础上,这 ...

  4. Pytorch入门中 —— 搭建网络模型

    本节内容参照小土堆的pytorch入门视频教程,主要通过查询文档的方式讲解如何搭建卷积神经网络.学习时要学会查询文档,这样会比直接搜索良莠不齐的博客更快.更可靠.讲解的内容主要是pytorch核心包中 ...

  5. Memcached 状态机分析

    worker线程拿到了这个连接之后,就应该是分配给这个连接一个结构体,包括这个连接所有的状态,都写buf等,这个结构体就是conn,然后这个worker线程会在它自己的event_base加入对这个新 ...

  6. [BUUCTF]PWN——bjdctf_2020_router

    bjdctf_2020_router 附件 步骤: 例行检查,64位程序,开启了NX保护 本地试运行一下程序,看看大概的情况 会让我们选择,选择4.root,没什么用,但是注意了,这边选1会执行pin ...

  7. 有时候错误很奇怪啊,Comparator问题

    有时候错误很奇怪啊,Comparator问题,在我的电脑上排序好用,但是在别的电脑上排序不好用, 真奇怪a

  8. mysql数据库,当数据类型是float时,查询居然查询不出数据来

    mysql数据库,当数据类型是float时,查询居然查询不出数据来,类似如下: 以后mysql数据库不用float类型,而double类型可以查得出来.

  9. C++ 11新特性:std bind 原理简单图解(转载)

    本文解释了bind 是如何工作的.为了清晰,我对图中的语法作了一些简化(例如,省略函数调用操作符的参数类型),并且简化了 bind 的实现. bind 可以用来将用户提供的需要一个参数的函数转换成不需 ...

  10. git提交报错:Error merging: refusing to merge unrelated histories

    执行: git pull origin master --allow-unrelated-histories 然后再重新push即可