通过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获取用户位置信息以及地区时间
项目需要获取用户得位置信息以及地区时间,因为第一次搞,以防还有下次,特此记录 1.首先就是显得拿到用户得ip地址 先上代码: public boolean checkIp(String ip) {return null ip || ip.isEmpty() || "unknown".equa…...
pytest-yaml-sanmu(七):使用fixture返回值
fixture 是 pytest 中非常重要的功能,大部分项目都可能会用到 fixture。 pytest 的内置标记 usefixtures 可以帮助用例自动的使用 fixture 1. 创建 fixture pytest 中的 fixtures 大致有两个用途 在用例执行之前、执行之后,自动的执行 通过 fixture …...
2024最全软件测试面试八股文(答案+文档+视频讲解)
Part1 1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自…...
EasyBoss ERP移动端上线数据分析模块,随时查Shopee/TikTok本土店数据
前段时间,EasyBoss ERP出了个超酷炫的数字大屏功能,广受好评。 但是也有老板说,电脑端看数据不够方便啊,你们EasyBoss有本事上个手机就能看数据的功能啊! 说干就干,直接满足你们的需求! 于是在…...
机器学习与AI大数据的融合:开启智能新时代
在当今这个信息爆炸的时代,大数据和人工智能(AI)已经成为推动社会进步的强大引擎。作为AI核心技术之一的机器学习(Machine Learning, ML),与大数据的深度融合正引领着一场前所未有的科技革命,不…...
视频监控业务平台LntonCVS国标视频综合管理平台功能及技术优势
随着安防行业的快速进步,传统的视频监控平台正在与先进的技术和互联网技术融合,包括5G通信、GIS、大数据、云计算、边缘计算、AI识别、智能分析和视频直播等。这些技术的整合形成了综合性视频监控管理平台,具备集中管理、多级联网共享、互联互…...
Python面试宝典第6题:有效的括号
题目 给定一个只包括 (、)、{、}、[、] 这些字符的字符串,判断该字符串是否有效。有效字符串需要满足以下的条件。 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对应的相同类型的左括号。 注意:空字符…...
Windows上使用Navicat连接ubuntu上的mysql8报错:10061和1130
问题一:can’t connect to mysql server on ‘192.168.xxx.xxx’(10061) 解决: sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf,bind-address绑定了登陆的IP,把这两行代码注释掉,然后重启mysql。 问题二: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 新手教程:如何安装Windows 11 安卓子系统 说明 Windows Subsystem for Android 或 WSA 是由 Hyper-V 提供支持的虚拟机,可在 Windows 11 操作系统上运行 Android 应用程序。虽然它需…...
CD4017 – 带解码输出的十进制计数器
CD4017 IC 是一个十进制计数器,它有 10 个输出,分别代表 0 到 9 的数字。计数器在(14号引脚)每个时钟脉冲上升时增加 1。计数器达到 9 后,它会在下一个时钟脉冲时从 0 重新开始。 引脚名称管脚 #类型描述VD…...
Spring Boot 文件上传和下载指南:从基础到进阶
文章目录 引言1. 环境配置2. 文件上传2.1 配置文件上传路径2.2 创建上传服务2.3 创建上传控制器 3. 文件下载3.1 创建下载服务3.2 创建下载控制器 4. 前端页面4.1 文件上传页面4.2 文件下载页面 5. 技术分析结论 🎉欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o …...
Windows Server 2019部署网络负载均衡NLB服务的详细操作步骤
部署前准备 首先需要准备两台Windows Server 2019服务器,虚拟机创建请参考 VMware Workstation安装Windows Server2019系统详细操作步骤_安装windows server 2019操作系统(写出操作过程)-CSDN博客 克隆虚拟机请参考 VMware Workstation克隆虚拟机详细步骤-CSDN博…...
Java增加线程后kafka仍然消费很慢
文章目录 一、问题分析二、控制kafka消费速度属性三、案例描述 一、问题分析 Java增加线程通常是为了提高程序的并发处理能力,但如果Kafka仍然消费很慢,可能的原因有: 网络延迟较大:如果网络延迟较大,即使开启了多线…...
分布式事务实现技术及考虑点
什么是分布式事务? 首先理解什么是本地事务 平时我们在程序中通过Spring去控制事务是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所…...
JavaScript中闭包的理解
闭包(Closure)概念:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域。简单来说;闭包内层函数引用外层函数的变量,如下图: 外层在使用一个函数包裹住闭包是对变量的保护,…...
传统IO和NIO文件拷贝过程
参考:https://blog.csdn.net/weixin_57323780/article/details/130250582...
算法思想总结:优先级队列
一、最后一块石头的重量 . - 力扣(LeetCode) 我们每次都要快速找到前两个最大的石头进行抵消,这个时候用优先级队列(建大堆),不断取堆顶元素是最好的!每次删除堆顶元素后,可以自动调整…...
《米小圈日记魔法》边看边学,轻松掌握写日记的魔法!
在当今充满数字化娱乐和信息快速变迁的时代,如何创新引导孩子们学习,特别是如何培养他们的写作能力,一直是家长和教育者们关注的焦点。今天就向大家推荐一部寓教于乐的动画片《米小圈日记魔法》,该系列动画通过其独特的故事情节和…...
鸿蒙应用实践:利用扣子API开发起床文案生成器
前言 扣子是一个新一代 AI 应用开发平台,无需编程基础即可快速搭建基于大模型的 Bot,并发布到各个渠道。平台优势包括无限拓展的能力集(内置和自定义插件)、丰富的数据源(支持多种数据格式和上传方式)、持…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
