js获取设备公网ip + 服务器根据公网ip 获取IP信息
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信息的更多相关文章
- ios获取设备信息总结
1.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名 ...
- Uwp Windows10获取设备位置(经纬度)
先在Package.appxmanifest中配置位置权限 2. 创建LocationManager类 using System; using System.Collections.Generic; ...
- Swift - 使用CoreLocation获取设备方向(真实方向,磁极方向)
CoreLocation这个定位框架除了可以获取设备的位置数据,还可以获取设备的方向(可以用来实现指南针功能等). 1,CLHeading对象通过一组属性提供航向相关数据: magneticHeadi ...
- Android 开发 获取设备信息与App信息
设备信息 设备ID(DeviceId) 获取办法 android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager ...
- ios 获取设备相关的信息
.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名称 NSStr ...
- Xamarin.Forms获取设备屏幕大小
Xamarin.Forms获取设备屏幕大小 可以借助device.Display获取.基本形式如下: var display = device.Display;然后就可以获取屏幕大小.display. ...
- 没有公网IP的服务器如何通过有公网的服务器实现远程管理的功能?即VPN服务器搭建过程
由于很多PPPoE帐号都没有公网IP了,那我们如何实现远程管理呢? 答案是比较简单的,首先,你要拥有一台有公网IP的路由器,其他品牌的也可以,但是下面我以WayOs作为VPN服务器,给大家一个教程. ...
- python获取公网ip,本地ip及所在国家城市等相关信息收藏
python获取公网ip的几种方式 from urllib2 import urlopen my_ip = urlopen('http://ip.42.pl/raw').read() ...
- java获取客户端请求IP地址(公网ip)
之前写了一个获取ip地址的方法,但是放网上一查显示此Ip地址是局域网ip地址,要是想获取请求端的真实公网ip地址怎么样了,看了一些别人的博客后发现,想要获取客户端的公网ip必须借助第三方. packa ...
随机推荐
- C# 温故知新 第一篇 C# 与 .net 的关系
C# 与.net 的关系很多初学者或者未从事过.net 研发的编程人员 都不是很清楚,认为 C# 与.net 是一回事. 我们经常说java开发,C++开发,指的是两种开发语言:但是 经常看到 .ne ...
- 度量驱动的DevOps实现
目录 一.简介 二.度量是什么 三.实践 四.QA问答 一.简介 Wiki上讲:DevOps(Development和Operations的组合词)是一种重视"软件开发人员(Dev)&quo ...
- DevOps的分与合
一.抽象的 DevOps DevOps 是使软件开发和 IT 团队之间的流程自动化的一组实践,以便他们可以更快,更可靠地构建,测试和发布软件.DevOps 的概念建立在建立团队之间协作文化的基础上,这 ...
- 【antd】表单-单页面多表单提交功能
需求:多个表单,我想一起校验一起提交,比如这里的上下两个部分为两个组件,两个form表单 功能点:1.所有报表需通过校验 2.通过校验后提交并带入所有参数 核心问题:form表单的validateFi ...
- Elasticsearch核心技术(四):索引原理分析
本文探讨Elasticsearch的数据请求.路由和写入过程的原理,主要涉及ES的分布式存储架构.节点和副本的写入过程.近实时搜索的原因.持久化机制等. 4.1 ES存储架构 我们经常说,看一件事情千 ...
- [BUUCTF]PWN——others_shellcode
others_shellcode 附件 解题步骤: 例行检查,32位程序,开启了NX(堆栈不可执行)和PIE(地址随机化)双重保护 试运行了一下,发现直接就能执行shell的命令 远程连接运行一下,直 ...
- SP8374 PARKET1 - PARKET 题解
Content 有一个 \(l\times w\) 大小的网格,其四周均被染成了红色,其余部分是棕色,已知红色网格与棕色网格的数量,求 \(l\) 与 \(w\) 的值. Solution 接下来给各 ...
- RabbitMQ 消息队列 实现RPC 远程过程调用交互
#!/usr/bin/env python # Author:Zhangmingda import pika,time import uuid class FibonacciRpcClient(obj ...
- RenderFlex children have non-zero flex but incoming height constraints are unbounded.
问题 Flexible 里用了 Column, 使得高度无法确定 解决方案 将Flexible替换为ConstrainedBox, 并设定maxHeight 代码 ConstrainedBox( co ...
- AcWing 466. 回文日期
题目: 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用 8 位数字表示一个日期,其中,前 4 位代表年份,接下来 2 位代表月份,最后 2 位代表日期. 显然:一个日 ...