前端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.hqwc.cn/news/498188.html

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

相关文章

Python多功能课堂点名器、抽签工具

一、问题缘起 去年&#xff0c;ChatGPT浪潮袭来&#xff0c;我懂简单的Python基础语法&#xff0c;又有一些点子&#xff0c;于是借助于人工智能问答工具&#xff0c;一步一步地制作了一个点名器&#xff0c;也可以用于抽签。当时&#xff0c;我已经设计好页面和基础的功能&am…

Leetcode 第 385 场周赛题解

Leetcode 第 385 场周赛题解 Leetcode 第 385 场周赛题解题目1&#xff1a;3042. 统计前后缀下标对 I思路代码复杂度分析 题目2&#xff1a;3043. 最长公共前缀的长度思路代码复杂度分析 题目3&#xff1a;3044. 出现频率最高的质数思路代码复杂度分析 题目4&#xff1a;3045. …

【EFK】基于K8S构建EFK+logstash+kafka日志平台

基于K8S构建EFKlogstashkafka日志平台 一、常见日志收集方案1.1、EFK1.2、ELK Stack1.3、ELK filbeat1.4、其他方案 二、EFK组件介绍2.1、Elasticsearch组件2.2、Filebeat组件【1】 Filebeat和beat关系【2】Filebeat是什么【3】Filebeat工作原理【4】传输方案 2.3、Logstash组件…

本届挑战赛季军方案:基于图网络及LLM AGENT的微服务系统异常检测和根因定位方法

aiboco团队荣获本届挑战赛季军。该团队来自亿阳信通。 方案介绍 本届挑战赛采用开放式赛题&#xff0c;基于建行云龙舟运维平台的稳定性工具和多维监控系统&#xff0c;模拟大型的生活服务APP的生产环境&#xff0c;提供端到端的全链路的日志、指标和调用链数据。参赛队伍在组…

操作系统:IO管理概述

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f3c6;&#x1f3c6;本文完整PDF源文件请翻阅至文章底部下载。&#x1f3c6;&#x1f3c6; 1 I/O设备的基本概念与分类1.1 总览1.2 什么是IO设备1.3 IO设备的分类1…

yolov8涨点技巧,添加SwinTransformer注意力机制,提升目标检测效果

目录 摘要 SwinTransformer原理 代码实现 YOLOv8详细添加步骤 ymal文件内容 one_swinTrans three_swinTrans 启动命令 完整代码分享 摘要 Swin Transformer通过引入创新的分层注意力机制展现了其架构的独特性&#xff0c;该机制通过将注意力区域划分为块并在这些块内执…

NutUI + taro +vue 开发遇到的问题 使用popup组件 内部元素滚动遇到的的问题

1 popup 弹出内容时 弹出的框内元素数据很长需要滚动时 本地可以正常滚动 打包成小程序后无法滚动 如这样的免责条款内容 代码如下 解决办法 1 把2处的单位换成百分比 弹框能滚动但是 是popup 里面所有的元素都一起滚动 导致标题都滚走了 2 scroll-y 改成&#xff1a; :scrol…

Spring Task的应用

介绍 Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a; 定时任务框架 作用&#xff1a; 定时自动执行某段Java代码 应用场景&#xff1a; 引用卡每月还款提醒、银行贷款每月还款提醒、火车票售票系统处理未支…

Vulnhub内网渗透Masashi-1靶场通关

完整内容见我的博客xzajyjs.cn 靶场下载地址。 下载下来后是 .vmdk 格式&#xff0c;vm直接导入。 M1请使用UTM进行搭建&#xff0c;教程见此。该靶场可能出现网络问题&#xff0c;解决方案见此 信息搜集 arp-scan -l # 主机发现&#xff0c;目标位192.168.168.14 nmap -sV …

单片机SWJ 调试端口(SW-DP和JTAG)、SWD下载电路

单片机下载接口是指用于将编写好的程序代码下载到单片机芯片中的接口。常见的单片机下载接口包括以下几种&#xff1a; 1. **串口下载接口**&#xff1a;通过串口&#xff08;如UART或RS-232接口&#xff09;与计算机或下载器相连&#xff0c;将程序代码通过串口传输到单片机内…

为高频大功率设计的双面水冷厚膜电阻方案

EAK双面水冷厚膜电阻是一种具有良好散热性能的电阻器&#xff0c;常用于需要高效散热的电子设备中。其包括第一绝缘介质层、厚膜电阻层、第二绝缘介质层以及用于液体流通的金属腔体&#xff0c;第一绝缘介质层设置于金属腔体的上表面&#xff1b;第一绝缘介质层表面设有厚膜电阻…

行政区划代码 powerquery

https://www.mca.gov.cn/n156/n186/index.html 选中删除其他列 if [末尾4位] "0000" then [单位名称] else if [末尾4位] <> "0000" and Text.End([末尾4位],2) "00" then [单位名称] else null if [结尾字符] "0000" then …