前端Ajax获取当前外网IP地址并通过腾讯接口解析地理位置

目录

一、获取访问端IP地址

二、可用的IP获取接口

1、韩小韩IP获取接口:

 2、ipify API

 附3、失败的太平洋接口

三、腾讯位置服务-IP位置查询接口


一、获取访问端IP地址

原计划使用后端HttpServletRequest 获取访问端的IP地址,但在nginx和堡垒机等阻碍下始终只能获得网关的地址,方法如下:

    public String buildLicense_2(@RequestBody Map map, HttpServletRequest request){//只能获取到网关的ip,获取不到真实IPString ipAddress = IpUtil.getIpAddr(request);System.err.println("IP地址:"+ipAddress);}
/*** 获取IP地址** 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址* 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址*/public static String getIpAddr(HttpServletRequest request) {if (request == null) {return "unknown";}String ip = request.getHeader("x-forwarded-for");System.out.println("x-forwarded-for IP地址:"+ip);if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");System.out.println("Proxy-Client-IP IP地址:"+ip);}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("X-Forwarded-For");System.out.println("X-Forwarded-For IP地址:"+ip);}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");System.out.println("WL-Proxy-Client-IP IP地址:"+ip);}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("X-Real-IP");System.out.println("X-Real-IP IP地址:"+ip);}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}try{System.out.println("getRemoteAddr() IP地址:"+request.getRemoteAddr());}catch (Exception ex){}return "0:0:0:0:0:0:0:1".equals(ip) ? LOCAL_IP : ip;}

故在前端通过第三方接口,获取当前ip地址后再传到后端

具体如下:

function getIpInfo() {$.ajax({url: "https://api.vvhan.com/api/visitor.info",// "https://api.ipify.org?format=json",type: "GET", //data: { val1: "1", val2: "2" },dataType: "json", success: function (result) {console.log("IP地址:");console.log(result);ipData = result;},error: function () {console.log('获取ip失败');}});
}

二、可用的IP获取接口

如上所示,使用的是第三方

1、韩小韩IP获取接口:

API地址:https://api.vvhan.com/api/visitor.info

API文档地址:https://api.vvhan.com/fangke.html

返回示例:

 使用说明:

 韩小韩接口站API大全:韩小韩API接口站 - 免费API数据接口调用服务平台

 2、ipify API

API地址:https://api.ipify.org?format=json

官网地址:https://www.ipify.org/

 可再各个环境下调用

 附3、失败的太平洋接口
var whois = {root: 'http://whois.pconline.com.cn',version: 2.0,jsonIp: function () {var s = document.getElementsByTagName('head')[0].appendChild(document.createElement("script"));/*s.src = this.root + "/jsAlert.jsp?ip=" + ip;*/s.type = "application/javascript";s.src = this.root + "/ipJson.jsp?callback=callbackRepos";console.log(s.src);},lableIp: function (id, ip) {var s = document.getElementsByTagName('head')[0].appendChild(document.createElement("script"));s.src = this.root + "/jsLabel.jsp?ip=" + ip + "&id=" + id;}
}
function getCurIP() {whois.jsonIp();
}
function callbackRepos(res) {console.log(res);//var data = JSON.stringify(res); //json对象转成字符串//console.log(data);ipData = res;
}

接口地址:

http://whois.pconline.com.cn

http://whois.pconline.com.cn/ipJson.jsp

只能以如上所示方式调用,在本地可用,一旦部署到外网环境下就是会失败403错误。还会存在跨域问题。所以此法不可用,却浪费了我许多时间。

三、腾讯位置服务-IP位置查询接口

在后台通过腾讯接口将IP地址转换为县区市级别的位置信息,以上的接口只能查询到地级市。

API文档地址:WebService API | 腾讯位置服务

注册腾讯位置服务,创建App,获取app key之后即可在后台调用,

如下所示,返回 省-市-县-县代码

String s = sendGet(ip, KEY);
//        System.out.println("IP地址查询结果s=" + s);JSONObject map =new JSONObject(s);String message = (String) map.get("message");if("Success".equals(message)){Map result = (Map) map.get("result");Map addressInfo = (Map) result.get("ad_info");String nation = (String) addressInfo.get("nation");String province = (String) addressInfo.get("province");String district = (String) addressInfo.get("district");String city = (String) addressInfo.get("city");Integer XZQDM = (Integer) addressInfo.get("adcode");String address = province + "-" + city + "-" + district + "-"  + XZQDM;return address;}else{System.out.println("message="+message);return message;}
 //根据在腾讯位置服务上申请的key进行请求操作private static String sendGet(String ip, String key) {String result = "";BufferedReader in = null;try {String urlNameString = "https://apis.map.qq.com/ws/location/v1/ip?ip="+ip+"&key="+key;URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段
//            for (Map.Entry entry : map.entrySet()) {
//                System.out.println(key + "--->" + entry);
//            }// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}

附参考文章:

Ajax请求后端接口(GET、POST、轮询请求)_ajax post_IamaMartian的博客-CSDN博客

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Ubuntu 中卸载 Microsoft Edge 浏览器

1在 Ubuntu 中卸载 Microsoft Edge 非常容易&#xff0c;只需在「终端」中执行如下命令即可&#xff1a; sudo apt autoremove microsoft-edge-stable --purge 卸载 Microsoft Edge 2卸载完成后&#xff0c;可执行以下命令删除microsoft-edge.gpg密钥&#xff1a; sudo rm -rf…

峟思科普小(1)型土石坝安全监测设备的基本配置与策略

土石坝&#xff0c;作为水利工程中的重要组成部分&#xff0c;其安全性能直接关系到下游人民的生命财产安全。为了确保土石坝的安全运行&#xff0c;必须对其进行科学有效的安全监测。本文将详细阐述小(1)型土石坝安全监测设备的基本配置与策略。 首先&#xff0c;对于存在渗漏…

C# 中的执行表达式树(Expression Tree)

引言&#xff1a; 在C#编程中&#xff0c;表达式树&#xff08;Expression Tree&#xff09;是一种强大的工具&#xff0c;用于表示和执行计算表达式。表达式树将计算表达式抽象为树状结构&#xff0c;每个节点代表表达式中的一个元素&#xff0c;如常量、变量、方法调用等。本…

后端实现跨域(三种方式)

相较于前端实现跨域&#xff0c;有时会出现跨域失败&#xff0c;列举后端三种方式实现跨域 1.加注解 代码重复 /*** 获取用户信息* * return 用户信息*/GetMapping("getInfo")CrossOriginpublic AjaxResult getInfo(){SysUser user SecurityUtils.getLoginUser().g…

JVM运行时数据区——运行时数据区及线程概述

文章目录 1、运行时数据区概述2、线程3、小结 内存是非常重要的系统资源&#xff0c;是硬盘和CPU的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM在程序执行期间把它所管理的内存分为若干个不同的数据区域。这些不同的数据区域可以分为两种类型&#xff…

“智农”-农业一体化管控平台

大棚可视化|设施农业可视化|农业元宇宙|农业数字孪生|大棚物联网|大棚数字孪生|农业一体化管控平台|智慧农业可视化|智农|农业物联网可视化|农业物联网数字孪生|智慧农业|大棚三维可视化|智慧大棚可视化|智慧大棚|农业智慧园区|数字农业|数字大棚|农业大脑|智慧牧业数字孪生|智…

JS进阶——高级技巧

版权声明 本文章来源于B站上的某马课程&#xff0c;由本人整理&#xff0c;仅供学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;本人致力于维护原创作品的权益&#xff0c;共同营造一个尊重知识…

【饮食】如何有效的补充维生素,矿物质?学习笔记(附膳食营养素参考摄入量DRIs)

程序员养生指南之 【饮食】如何有效的补充维生素&#xff0c;矿物质&#xff1f;学习笔记&#xff08;附膳食营养素参考摄入量DRIs&#xff09; 文章目录 一、维生素补充1、需要补充维生素的情况2、食补&#xff1a;缺啥补啥3、补充剂&#xff08;无脑吃&#xff09; 二、膳食营…

Android 跨进程通信aidl及binder机制详解(一)

前言 上文中描述了&#xff0c;什么是绑定服务、以及创建一个绑定服务都可以通过哪些方式&#xff0c;同时说了通过扩展Binder类来创建一个绑定服务&#xff0c;并使用一个例子来说明了客户端与服务端的绑定过程&#xff0c;最后又总结了绑定服务的生命周期与调用过程。由于上…

(unity学习)一些效果的学习

一、学习视频 【Unity教程】零基础带你从小白到超神 二、效果实现 三、问题解决 Unity 点击UI与点击屏幕冲突的解决方案 关于unity UI界面操作与场景内操作不冲突问题

Unity安装与简单设置

安装网址&#xff1a;https://unity.cn 设置语言&#xff1a; 设置安装位置&#xff1a;否则C盘就会爆了 获取一个个人的资格证&#xff1a; 开始安装&#xff1a; 安装完毕。 添加模块&#xff1a;例如简体中文 新建项目&#xff1a; 布局2*3、单栏布局、 设置…

4. client-go 编程式交互

Kubernetes 系统使用 client-go 作为 Go 语言的官方编程式交互客户端库&#xff0c;提供对 Kubernetes API Server 服务的交互访问。Kubernetes 的源码中已经集成了 client-go 的源码&#xff0c;无须单独下载。client-go 源码路径为 vendor/k8s.io/client-go。 开发者经常使用…

前端架构: 脚手架之包管理工具的案例对比及workspace特性的基本使用

Npm WorkSpace 特性 1 &#xff09;使用或不使用包管理工具的对比 vue-cli 这个脚手架使用 Lerna 管理&#xff0c;它的项目显得非常清晰在 vue-cli 中包含很多 package 点开进去&#xff0c;每一个包都有package.json它里面有很多项目&#xff0c;再没有 Lerna 之前去维护和管…

threehit二次注入案例

君衍. 一、环境搭建1、conn.php源码&#xff1a;2、register.php源码3、login.php源码4、index.php源码5、demo.php源码 二、数据库环境搭建1、注意点一2、注意点二报错原因 三、复现过程1、user12、user23、user34、user45、user56、user6-name7、user7-table8、user8-column9…

c++ 11: lock_guard/unique_lock详解

参考&#xff1a;C11 并发指南三(std::mutex 详解) - Haippy - 博客园 (cnblogs.com) c 11&#xff1a; lock_guard/unique_lock详解_c lock_guard-CSDN博客 C14 17共享超时互斥锁 shared_timed_mutex / 共享锁 shared_mutex-CSDN博客 概述 头文件介绍 Mutex 系列类(六种) …

Python编程实验五:文件的读写操作

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握与文件打开、关闭相关的函数&#xff0c;以及与读写操作相关的常用方法的…

vue中scss样式污染引发的思考

新做了一个项目&#xff0c;就是在登录后&#xff0c;就会产生左侧菜单的按钮颜色不一样。 然后发现样式是从这里传过来的 然后发现是登录页面的css给污染了 就是加了scope就把这个问题解决了 然后想总结一下这个思路&#xff1a;就是如何排查污染样式&#xff0c; 如果出现…

元素实现吸顶

1、position: sticky 直接设置元素需要吸顶的距离&#xff0c; <!-- App.vue --> <template><div id"app"><!-- <List:items"items":size"60":shownumber"10"/> --><div id"topHeight"&…

postman测试接口

1、postman测试接口 &#xff08;1&#xff09;首先安装postman 下载地址&#xff1a;Download Postman | Get Started for Free 选择对应版本下载&#xff0c;然后安装即可 &#xff08;2&#xff09;使用postman发送请求 比如以下这个请求例子&#xff1a; 使用postman发…

SpringBoot集成EasyExcel快速人们

目录 1.背景介绍 2.EasyExcel的使用 1.添加依赖 2.相关代码准备 1.实体类 2.ExcelUtil工具类 3.写入控制类 1.背景介绍 EasyExcel 是阿里巴巴开发的一款基于 Java 的专业化 Excel 操作工具&#xff0c;主要用于在 Java 应用程序中快速、高效地读写 Excel 文件。EasyExce…