当前位置: 首页 > news >正文

通过ip获取用户位置信息以及地区时间

项目需要获取用户得位置信息以及地区时间,因为第一次搞,以防还有下次,特此记录

1.首先就是显得拿到用户得ip地址

先上代码:

    public  boolean checkIp(String ip) {return null == ip || ip.isEmpty() || "unknown".equalsIgnoreCase(ip);}public String getIp(HttpServletRequest request){// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址String headerName = "x-forwarded-for";String ip = request.getHeader(headerName);if (null != ip && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip)) {// 多次反向代理后会有多个IP值,第一个IP才是真实IP,它们按照英文逗号','分割if (ip.contains(",")) {ip = ip.split(",")[0];}}if (checkIp(ip)) {headerName = "Proxy-Client-IP";ip = request.getHeader(headerName);}if (checkIp(ip)) {headerName = "WL-Proxy-Client-IP";ip = request.getHeader(headerName);}if (checkIp(ip)) {headerName = "HTTP_CLIENT_IP";ip = request.getHeader(headerName);}if (checkIp(ip)) {headerName = "HTTP_X_FORWARDED_FOR";ip = request.getHeader(headerName);}if (checkIp(ip)) {headerName = "X-Real-IP";ip = request.getHeader(headerName);}if (checkIp(ip)) {headerName = "remote addr";ip = request.getRemoteAddr();// 127.0.0.1 ipv4, 0:0:0:0:0:0:0:1 ipv6if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {//根据网卡取本机配置的IPInetAddress inet = null;try {inet = InetAddress.getLocalHost();} catch (UnknownHostException e) {throw new SvcException(e.getMessage());}if(inet!=null){ip = inet.getHostAddress();}}}return ip;}

原理:客户端想要跟服务端交互,必然经历三次握手,因此必然会告诉服务端自己得ip。再从服务端说起,如果服务器直接把IP暴漏出去,那么request.getRemoteAddr()就能拿到客户端ip。

但目前流行的架构中,基本上服务器都不会直接把自己的ip暴漏出去,一般前面还有一层或多层反向代理,常见的nginx居多。
加了代理后,相当于服务器和客户端中间还有一层,这时候request.getRemoteAddr()拿到的就是代理服务器的ip了,并不是客户端的ip。所以这种情况下,一般会在转发头上加X-Forwarded-For等信息,用来跟踪原始客户端的ip。

这时候,才会用上面的这些代码。解释下这些加上的信息
 

X-Forwarded-For:这是一个 Squid 开发的字段,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。格式为X-Forwarded-For:client1,proxy1,proxy2,一般情况下,第一个ip为客户端真实ip,后面的为经过的代理服务器ip。Proxy-Client-IP/WL- Proxy-Client-IP:这个一般是经过apache http服务器的请求才会有,用apache http做代理时一般会加上Proxy-Client-IP请求头, 而WL-Proxy-Client-IP是他的weblogic插件加上的头。 这种情况也是直接能拿到。HTTP_CLIENT_IP:有些代理服务器也会加上此请求头。X-Real-IP:nginx一般用这个。

说到底就是一个一个测试。

Nginx 的作用与问题

Nginx 作为一个反向代理,主要是接收来自客户端的请求,然后将请求转发给后端的服务器。在这个过程中,Nginx 会修改 HTTP 请求的来源 IP 地址,替换为它自己的 IP 地址。这样的设计使得后端服务器只需要处理来自一个 IP 地址的请求,简化了很多复杂性。

然而,这种设计也带来了一个问题:后端服务器无法获取到真实的客户端 IP 地址。在很多应用中,获取真实的客户端 IP 地址是非常重要的,例如,进行地理定位、检测欺诈行为、限制访问速率等。

Nginx 配置的解决方法

要解决这个问题,我们可以在 Nginx 的配置中添加一些设置,以将客户端的真实 IP 地址添加到请求的 "X-Forwarded-For" 和 "X-Real-IP" 头中。在你的 Nginx 配置文件的相应 location 或 server 区块中添加以下行:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

这些行的作用是将客户端的 IP 地址添加到每个请求的 "X-Real-IP" 和 "X-Forwarded-For" 头中。然后,你的应用就可以从这些头中读取到客户端的真实 IP 地址了。

实际操作步骤

一旦我们了解了原理,接下来就是实际操作步骤。在你的 Nginx 配置文件(通常为 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/default)中,找到你需要配置的 server 或 location 块,在其中添加上述的两行 proxy_set_header 配置:

location / {proxy_pass http://your_backend;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

经过前面步骤一般来说可以拿到我们得用户ip了

2.获取地理信息以及时区时间

我是用的ip2location来确立得位置信息以及时区信息。

先导入pom.xml

        <dependency><groupId>com.maxmind.geoip2</groupId><artifactId>geoip2</artifactId><version>2.17.0</version></dependency>

然后去官网下载一个GeoLite2-City.mmdb文件

最后直接上代码了

    public String info(HttpServletRequest request) throws IOException, GeoIp2Exception {String ip = getIp(request);String databasePath = "/tmp/GeoLite2-City.mmdb";File database = new File(databasePath);dbReader = new DatabaseReader.Builder(database).build();InetAddress ipAddress = InetAddress.getByName(ip);CityResponse response;try {response = dbReader.city(ipAddress);}catch (AddressNotFoundException e){throw new SvcException(CodeResponse.ADDRESS_ABNORMALITY);}String cityName = response.getCity().getName(); // 获取城市名称Country country = response.getCountry(); // 获取国家信息String countryName = country.getNames().get("zh-CN"); // 获取国家中文名称Location location = response.getLocation(); // 获取地理位置信息String timeZone = location.getTimeZone();   //时区TimeZone time = TimeZone.getTimeZone(timeZone);SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");TimeZone.setDefault(time);Calendar calendar = Calendar.getInstance();Date date = calendar.getTime();String Time = format.format(date);return "国家:" + countryName + ";城市:" + cityName + ";时区:" + timeZone + ";时间:" + Time;}

参考:

java后端获取客户端(用户)真实ip,原理_用户请求后台时获取到用户地址-CSDN博客

Nginx反向代理及获取真实的客户端IP地址-腾讯云开发者社区-腾讯云 (tencent.com)

GeoLite2 City库的基本使用与下载, 通过ip查询地址_geolite2-city.mmdb 下载-CSDN博客

还有个博主自己写了个包,可以获取简单得地理位置信息:

根据IP获取地理位置Java(准确率99%)_java获取ip定位城市-CSDN博客

相关文章:

通过ip获取用户位置信息以及地区时间

项目需要获取用户得位置信息以及地区时间&#xff0c;因为第一次搞&#xff0c;以防还有下次&#xff0c;特此记录 1.首先就是显得拿到用户得ip地址 先上代码&#xff1a; public boolean checkIp(String ip) {return null ip || ip.isEmpty() || "unknown".equa…...

pytest-yaml-sanmu(七):使用fixture返回值

fixture 是 pytest 中非常重要的功能&#xff0c;大部分项目都可能会用到 fixture。 pytest 的内置标记 usefixtures 可以帮助用例自动的使用 fixture 1. 创建 fixture pytest 中的 fixtures 大致有两个用途 在用例执行之前、执行之后&#xff0c;自动的执行 通过 fixture …...

2024最全软件测试面试八股文(答案+文档+视频讲解)

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…...

EasyBoss ERP移动端上线数据分析模块,随时查Shopee/TikTok本土店数据

前段时间&#xff0c;EasyBoss ERP出了个超酷炫的数字大屏功能&#xff0c;广受好评。 但是也有老板说&#xff0c;电脑端看数据不够方便啊&#xff0c;你们EasyBoss有本事上个手机就能看数据的功能啊&#xff01; 说干就干&#xff0c;直接满足你们的需求&#xff01; 于是在…...

机器学习与AI大数据的融合:开启智能新时代

在当今这个信息爆炸的时代&#xff0c;大数据和人工智能&#xff08;AI&#xff09;已经成为推动社会进步的强大引擎。作为AI核心技术之一的机器学习&#xff08;Machine Learning, ML&#xff09;&#xff0c;与大数据的深度融合正引领着一场前所未有的科技革命&#xff0c;不…...

视频监控业务平台LntonCVS国标视频综合管理平台功能及技术优势

随着安防行业的快速进步&#xff0c;传统的视频监控平台正在与先进的技术和互联网技术融合&#xff0c;包括5G通信、GIS、大数据、云计算、边缘计算、AI识别、智能分析和视频直播等。这些技术的整合形成了综合性视频监控管理平台&#xff0c;具备集中管理、多级联网共享、互联互…...

Python面试宝典第6题:有效的括号

题目 给定一个只包括 (、)、{、}、[、] 这些字符的字符串&#xff0c;判断该字符串是否有效。有效字符串需要满足以下的条件。 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对应的相同类型的左括号。 注意&#xff1a;空字符…...

Windows上使用Navicat连接ubuntu上的mysql8报错:10061和1130

问题一&#xff1a;can’t connect to mysql server on ‘192.168.xxx.xxx’(10061) 解决&#xff1a; sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf&#xff0c;bind-address绑定了登陆的IP&#xff0c;把这两行代码注释掉&#xff0c;然后重启mysql。 问题二&#xff1a;1…...

Feign远程调用,请求头丢失情况

现象 解决方案 import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestContextHolde…...

Windows 11 安装 安卓子系统 (WSA)

How to Install Windows Subsystem for Android (WSA) on Windows 11 新手教程&#xff1a;如何安装Windows 11 安卓子系统 说明 Windows Subsystem for Android 或 WSA 是由 Hyper-V 提供支持的虚拟机&#xff0c;可在 Windows 11 操作系统上运行 Android 应用程序。虽然它需…...

CD4017 – 带解码输出的十进制计数器

CD4017 IC 是一个十进制计数器&#xff0c;它有 10 个输出&#xff0c;分别代表 0 到 9 的数字。计数器在&#xff08;14号引脚&#xff09;每个时钟脉冲上升时增加 1。计数器达到 9 后&#xff0c;它会在下一个时钟脉冲时从 0 重新开始。 引脚名称管脚 &#xff03;类型描述VD…...

Spring Boot 文件上传和下载指南:从基础到进阶

文章目录 引言1. 环境配置2. 文件上传2.1 配置文件上传路径2.2 创建上传服务2.3 创建上传控制器 3. 文件下载3.1 创建下载服务3.2 创建下载控制器 4. 前端页面4.1 文件上传页面4.2 文件下载页面 5. 技术分析结论 &#x1f389;欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o …...

Windows Server 2019部署网络负载均衡NLB服务的详细操作步骤

部署前准备 首先需要准备两台Windows Server 2019服务器&#xff0c;虚拟机创建请参考 VMware Workstation安装Windows Server2019系统详细操作步骤_安装windows server 2019操作系统(写出操作过程)-CSDN博客 克隆虚拟机请参考 VMware Workstation克隆虚拟机详细步骤-CSDN博…...

Java增加线程后kafka仍然消费很慢

文章目录 一、问题分析二、控制kafka消费速度属性三、案例描述 一、问题分析 Java增加线程通常是为了提高程序的并发处理能力&#xff0c;但如果Kafka仍然消费很慢&#xff0c;可能的原因有&#xff1a; 网络延迟较大&#xff1a;如果网络延迟较大&#xff0c;即使开启了多线…...

分布式事务实现技术及考虑点

什么是分布式事务&#xff1f; 首先理解什么是本地事务 平时我们在程序中通过Spring去控制事务是利用数据库本身的事务特性来实现的&#xff0c;因此叫数据库事务&#xff0c;由于应用主要靠关系数据库来控制事务&#xff0c;而数据库通常和应用在同一个服务器&#xff0c;所…...

JavaScript中闭包的理解

闭包&#xff08;Closure&#xff09;概念&#xff1a;一个函数对周围状态的引用捆绑在一起&#xff0c;内层函数中访问到其外层函数的作用域。简单来说;闭包内层函数引用外层函数的变量&#xff0c;如下图&#xff1a; 外层在使用一个函数包裹住闭包是对变量的保护&#xff0c…...

传统IO和NIO文件拷贝过程

参考&#xff1a;https://blog.csdn.net/weixin_57323780/article/details/130250582...

算法思想总结:优先级队列

一、最后一块石头的重量 . - 力扣&#xff08;LeetCode&#xff09; 我们每次都要快速找到前两个最大的石头进行抵消&#xff0c;这个时候用优先级队列&#xff08;建大堆&#xff09;,不断取堆顶元素是最好的&#xff01;每次删除堆顶元素后&#xff0c;可以自动调整&#xf…...

《米小圈日记魔法》边看边学,轻松掌握写日记的魔法!

在当今充满数字化娱乐和信息快速变迁的时代&#xff0c;如何创新引导孩子们学习&#xff0c;特别是如何培养他们的写作能力&#xff0c;一直是家长和教育者们关注的焦点。今天就向大家推荐一部寓教于乐的动画片《米小圈日记魔法》&#xff0c;该系列动画通过其独特的故事情节和…...

鸿蒙应用实践:利用扣子API开发起床文案生成器

前言 扣子是一个新一代 AI 应用开发平台&#xff0c;无需编程基础即可快速搭建基于大模型的 Bot&#xff0c;并发布到各个渠道。平台优势包括无限拓展的能力集&#xff08;内置和自定义插件&#xff09;、丰富的数据源&#xff08;支持多种数据格式和上传方式&#xff09;、持…...

RocketMQ Dashboard监控告警配置全攻略:集成Prometheus+Grafana+钉钉

RocketMQ企业级监控告警体系构建指南&#xff1a;从Dashboard到智能预警 1. 监控体系架构设计基础 在分布式消息中间件的运维实践中&#xff0c;一套完善的监控告警系统如同人体的神经系统&#xff0c;能够实时感知集群状态并及时响应异常。RocketMQ Dashboard作为官方提供的管…...

Cesium交互绘图避坑指南:从CallbackProperty到CustomDataSource的完整流程

Cesium交互绘图避坑指南&#xff1a;从CallbackProperty到CustomDataSource的完整流程 在三维地理信息可视化领域&#xff0c;Cesium凭借其强大的渲染能力和丰富的API接口&#xff0c;已成为开发者构建交互式地图应用的首选工具。然而&#xff0c;当涉及动态绘图功能时&#xf…...

如何快速配置DLSS优化工具:终极性能提升指南

如何快速配置DLSS优化工具&#xff1a;终极性能提升指南 【免费下载链接】DLSSTweaks Tweak DLL for NVIDIA DLSS, allows forcing DLAA on DLSS-supported titles, tweaking scaling ratios & DLSS 3.1 presets, and overriding DLSS versions without overwriting game f…...

【Cadence Virtuoso】进阶:利用仿真数据反推工艺库MOSFET的λ与Vth实战

1. 为什么需要反推MOSFET参数&#xff1f; 刚接触TSMC 65nm工艺时&#xff0c;我发现PDK提供的参数表里λ和Vth都是固定值。但在实际设计电流镜和差分对时&#xff0c;这些"标准参数"总让我觉得哪里不对劲。后来在调试一个基准电流源时终于发现问题&#xff1a;PDK给…...

Anaconda环境下Lumerical lumapi模块导入失败的3种修复方法(实测有效)

Anaconda环境下Lumerical lumapi模块导入失败的深度解决方案 当你满怀期待地在Anaconda环境中安装完Lumerical相关组件&#xff0c;准备大展拳脚时&#xff0c;突然遭遇ModuleNotFoundError: No module named lumapi这样的错误提示&#xff0c;确实令人沮丧。这种情况在重装系…...

STM32C8T6最小系统板“隐形”电路详解:VBAT、BOOT、SWD那些容易忽略但关键的设计点

STM32C8T6最小系统板“隐形”电路详解&#xff1a;VBAT、BOOT、SWD那些容易忽略但关键的设计点 当你在深夜调试STM32最小系统板时&#xff0c;是否遇到过这些"玄学"问题&#xff1a;RTC时间莫名其妙丢失、SWD接口时好时坏、芯片突然"锁死"无法烧录&#xf…...

Qwen3-0.6B-FP8辅助Java八股文学习:智能抽题与答案要点生成

Qwen3-0.6B-FP8辅助Java八股文学习&#xff1a;智能抽题与答案要点生成 1. 引言&#xff1a;当面试备考遇上AI 准备Java面试&#xff0c;尤其是那些经典的“八股文”题目&#xff0c;对很多程序员来说是个既熟悉又头疼的过程。你可能也经历过&#xff1a;面对厚厚的面试宝典&…...

OpenClaw定时任务实践:Qwen3.5-4B-Claude实现凌晨数据备份自动化

OpenClaw定时任务实践&#xff1a;Qwen3.5-4B-Claude实现凌晨数据备份自动化 1. 为什么需要夜间自动化备份 作为一个独立开发者&#xff0c;我经常遇到这样的困境&#xff1a;白天在多个项目间切换开发&#xff0c;晚上关机前才想起忘记备份关键数据。手动执行备份不仅占用休…...

ReactPy虚拟DOM终极指南:Python如何高效更新网页内容

ReactPy虚拟DOM终极指南&#xff1a;Python如何高效更新网页内容 【免费下载链接】reactpy Its React, but in Python 项目地址: https://gitcode.com/gh_mirrors/re/reactpy ReactPy作为Python领域的创新框架&#xff0c;让开发者能够使用Python语法构建交互式Web界面&…...

终极指南:5个简单步骤用eqMac提升macOS音频体验 [特殊字符]

终极指南&#xff1a;5个简单步骤用eqMac提升macOS音频体验 &#x1f3a7; 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer &#x1f3a7; 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac 想为你的Mac打造专业级的音频体验吗&#x…...