ip获取+归属地实现

1.背景

现在的社交平台一般都需要展示用户的归属地,这个功能有下面二个主要功能点,接下来我们来介绍下具体实现。

  • IP 获取

  • IP 转归属地

2.ip获取

2.1 Http请求

对于controller的请求,我们只需要写个拦截器,将用户的ip设置进上下文即可,非常方便。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {RequestInfo info = new RequestInfo();   info.setUid(Optional.ofNullable(request.getAttribute(TokenInterceptor.ATTRIBUTE_UID)).map(Object::toString).map(Long::parseLong).orElse(null));info.setIp(ServletUtil.getClientIP(request));RequestHolder.set(info);return true;
}

ip在请求头中都会携带。直接用hutool的工具类获取ip

public static String getClientIP(HttpServletRequest request, String... otherHeaderNames) {String[] headers = {"X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR"};if (ArrayUtil.isNotEmpty(otherHeaderNames)) {headers = ArrayUtil.addAll(headers, otherHeaderNames);}return getClientIPByHeader(request, headers);
}

需要注意的是,如果我们开启了nginx来带来请求,需要在nginx里面保存用户真实ip到X-Real-IP,否则你拿到的就是nginx的ip地址了。

location /{proxy_pass http://127.0.0.1:8088;# 在 Nginx 的配置文件中使用 $remote_addr 可以获取到客户端的 IP 地址,# 这是因为 Nginx 会在接收到客户端请求时自动将客户端的真实 IP 地址存储在 $remote_addr 变量中。Malichyet proxy_set_header X-Real-IP $remote_elidnchatproxy_set_header Host $host;
}

2.2 websocket请求

对于websocket请求获取ip就会麻烦一些。

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

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

相关文章

生成式AI设计模式:综合指南

原文地址:Generative AI Design Patterns: A Comprehensive Guide 使用大型语言模型 (LLM) 的参考架构模式和心理模型 2024 年 2 月 14 日 对人工智能模式的需求 我们在构建新事物时,都会依赖一些经过验证的方法、途径和模式。对于软件工程师来说&am…

物联网与智慧城市的融合:构建智能化、便捷化、绿色化的城市未来

一、引言 随着科技的飞速发展和城市化的不断推进,物联网技术正逐步渗透到城市的各个领域,成为推动智慧城市建设的核心力量。物联网与智慧城市的融合,不仅为城市治理提供了高效、智能的解决方案,也为市民的生活带来了前所未有的便…

如何在Node.js中使用定时器

在Node.js中使用定时器是一项常见且重要的任务,特别是在需要执行定时任务或者轮询操作的情况下。Node.js提供了多种方式来实现定时器功能,包括setTimeout、setInterval和setImmediate等方法。本篇博客将介绍如何在Node.js中使用这些定时器,并…

(数据结构)二叉树

8.二叉树 8.1概述 二叉树是一种基本的非线性数据结构,它是由n(n>0)个节点构成的有限集合。在二叉树中,每个节点最多有两个子节点,通常被称作左孩子(left child)和右孩子(right c…

把python完全卸载干净

1.winR,输入control回车,点击程序和功能,在搜索框输入python,右键点击卸载 2、找到Python安装路径,把所有文件全部删除。 安装路径可以打开CMD输入:where python 3、强制删除Python.exe 打开cmd&#xff…

科技企业如何做到FTP数据安全保护

在数字化浪潮的推动下,科技企业的数据已成为推动创新、提升效率、增强竞争力的核心资源。数据的重要性不言而喻,它不仅包含了客户信息、市场分析、产品设计等关键信息,更是企业宝贵的资产。然而,随着数据量的激增,数据…

视觉AIGC识别——人脸伪造检测、误差特征 + 不可见水印

视觉AIGC识别——人脸伪造检测、误差特征 不可见水印 前言视觉AIGC识别【误差特征】DIRE for Diffusion-Generated Image Detection方法扩散模型的角色DIRE作为检测指标 实验结果泛化能力和抗扰动 人脸伪造监测(Face Forgery Detection)人脸伪造图生成 …

LabVIEW最佳传输系统设计

LabVIEW最佳传输系统设计 介绍了基于LabVIEW软件开发的最佳基带传输系统和最佳带通传输系统的设计。通过软件仿真实现了脉冲成形滤波器和匹配滤波器的设计,证明了系统在消除码间干扰和抗噪声方面的优异性能。此设计不仅激发了学生的学习兴趣,还有助于提…

智能家居控制系统(51单片机)

smart_home_control_system 51单片机课设,智能家居控制系统 使用及转载请标明出处(最好点个赞及star哈哈) Github地址,带有PPT及流程图 Gitee码云地址,带有PPT及流程图 ​ 以STC89C52为主控芯片,以矩阵键…

Java必须掌握的继承的概述

Java的继承是面向对象编程中的一个核心概念,它允许一个类继承另一个类的属性和方法。这不仅有助于代码的重用,还使得代码的管理和维护变得更加容易。在准备大厂面试时,理解继承的各个方面是非常重要的。以下是一些关于Java继承的概述和可能出…

Linux基本指令(上)

在Linux中,将文件夹称为目录,后面的内容都与目录相关。 1. ls指令 语法: ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用选项 …

MySQL的索引和B+tree结构

目录 0.关于索引的常见面试题 1.什么是索引? 索引的优缺点 2.索引的数据结构,为什么InnoDb引擎使用Btree作为索引的数据结构? 分析怎样的索引才是好的 二插搜索树 红黑树 B-Tree BTree 哈希 为什么 InnoDB 存储引擎选择使用 Btree 索…

iTOP-3588开发板快速测试手册Android12系统功能测试

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

mac 配置faas 全局二进制命令

FaaS(即功能即服务-Function as a Services)是一种云计算服务,允许客户执行代码来响应事件,而无需管理通常与构建和启动微服务应用程序相关的复杂基础架构 在互联网上托管软件应用程序通常需要配置和管理虚拟服务器或物理服务器&…

洛谷题单_递推与递归

P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //不满分做法&#xff1a;没有高精度 #include <bits/stdc.h> using namespace std; const int N5006; int dp[N];//dp[i]表示到第i节楼梯有dp[i]中方案 int main(){int n;cin>>n;dp[1]1;dp[0]1;for(i…

MySQL(基础篇)——多表查询

一.多表关系 一对多(多对一) 多对多一对一 1.一对多(多对一) a.案例&#xff1a;部门与员工的关系 b.关系&#xff1a;一个部门对应多个员工&#xff0c;一个员工对应一个部门 c.实现&#xff1a;在多的一方建立外键&#xff0c;指向一的一方的主键 2.多对多 a.案…

Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client

Elasticsearch入门-环境安装ES和Kibana 安装 ES Windows安装ESHead安装浏览器插件 es-clientKibana 安装 安装es,安装header 安装kibana&#xff0c;安装多种分词器ik… 安装 ES Windows安装 ① 下载压缩包并解压官网链接&#xff1a;https://www.elastic.co/cn/downloads/ela…

JDK制作p12文件

生成密钥对 首先&#xff0c;我们需要生成一对密钥&#xff0c;用来进行证书的生成和签名。可以使用Java的keytool工具来生成密钥对。 keytool -genkeypair -alias mykey -keyalg RSA -keysize 2048 -validity 365 -keystore mykeystore.jks上述命令中的各个参数含义如下&…

canvas坐标系统 webgl坐标系统 uv纹理坐标系统 原点

一、canvas原点在左上角&#xff0c;x轴正方向向右&#xff0c;y轴正方向向下&#xff0c;一个点对应一个像素 二、webgl原点在正中间&#xff0c;x轴正方向向右&#xff0c;y轴正方向向上&#xff0c;数据显示范围在[-1,1]之间&#xff0c;超过此范围不显示数据 三、uv原点在左…

Eigen-矩阵切片和索引

矩阵切片和索引 一、概述二、基本的切片三、编译时间大小和增量四、相反的顺序五、索引数组六、自定义索引列表 一、概述 本页介绍了操作符 () 为索引子集行和列提供的多种可能性。这个API已经在特性3.4中引入。它支持块API提出的所有特性&#xff0c;以及更多。特别是&#x…