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 ...
随机推荐
- 12.Vue.js 表单
这节我们为大家介绍 Vue.js 表单上的应用. 你可以用 v-model 指令在表单控件元素上创建双向数据绑定. <div id="app"> <p>in ...
- 【手帐】Bullet Journal教程
最近觉得自己的日程记录本有待提高,于是从今年开始开始入坑了手帐. *内容源自Bullet Journal官网.https://bulletjournal.com/pages/learn 快速笔记 Bu ...
- Mysql配置文件 基本设置
[mysqld] #MySQL启动用户 user = mysql #设置mysql的安装目录 basedir=/usr/local/mysql #mysql.sock存放目录 socket=/var/ ...
- [BUUCTF]REVERSE——[V&N2020 公开赛]CSRe
[V&N2020 公开赛]CSRe 附件 步骤: 例行检查,无壳儿,但是有NET混淆,使用de4dot工具进行处理 之后用dnSpy打开,从入口点开始看程序 找到有关flag的信息 flag由 ...
- Python旋转魔方阵
[问题描述]输入一个自然数N(2≤N≤9),要求输出如下的魔方阵,即边长为N*N,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素. N=3时: 1 2 3 8 ...
- java 多线程: Thread 并发访问-代码块同步synchronized {};String作为被锁的对象
方法同步的弊端 方法同步的时候,如果一个方法需要线程安全控制的代码速度其实很快,但是还有其他的业务逻辑代码耗时非常长(比如网络请求),这样所有的线程就在这一块就等待着了,这样造成了极大的资源浪费如果并 ...
- 简单备忘一下Linux下的wget和curl如何使用http proxy
简单备忘一下Linux下的wget和curl如何使用http proxywget -e "http_proxy=porxyhost:port" www.baidu.comcurl ...
- InnoDB学习(五)之数据库锁
InnoDB存储引擎的默认隔离级别事可重复读,MVCC多版本并发控制仅仅解决了快照读情况下的数据隔离,而对于当前读,InnoDB通过锁来进行并发控制. InnoDB锁 本文主要参考了MySQL官方文档 ...
- 通过go调用bat解决乱码核心代码
背景:通过go写的程序调用dos命令(如dir c:),返回值往往有中文,默认会出现乱码. 解决:转码. 代码:GO package shellLib import ( "golang.or ...
- JS判断是否为“YYYYMMDD”式的日期
function isDate8(sDate) { if (!/^[0-9]{8}$/.test(sDate)) { return false; } var year, month, day; yea ...