SpringCloud使用Nginx代理、Gateway网关以后如何获取用户的真实ip

devtools/2024/11/14 3:15:36/

前言

     本文转载自: www.microblog.store,且已获得授权.

一、需求背景

     微服务架构使用了Nginx代理转发、并且使用了SpringCloud的Gateway统一控制所有请求,现在有个需求: 做一个日子记录切面,需要记录用户请求的ip地址
     在上述双重背景下,通过普通的方法获取用户ip地址是不可行的,只能获取到引用部署所在服务器的内网地址,必须要做一系列的设置以后才能正确获取到响应的地址。

二、解决办法

2.1 Nginx设置

  location / { root /opt/xxx/xxx-auth; index  index.html index.htm; try_files $uri $uri/ /index.html; # 获取用户请求ipproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;  #获取客户端真实IPproxy_set_header REMOTE-HOST $remote_addr;}

gateway_22">2.2 gateway网关设置

@Component
@Log4j2
public class AuthenticationFilter implements GlobalFilter, Ordered {/*** 验证请求头是否带有Authentication*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();String path = request.getPath().pathWithinApplication().value();Optional.of(exchange.getRequest()).ifPresent(item -> {// 获取客户端IP地址List<String> xForwardedFor = item.getHeaders().get("x-forwarded-for");List<String> xRealIp = item.getHeaders().get("x-real-ip");List<String> remoteHost = item.getHeaders().get("remote-host");response.getHeaders().add("X-Forwarded-For", (xForwardedFor == null || xForwardedFor.isEmpty()) ? "" :xForwardedFor.get(0));response.getHeaders().add("X-Real-IP", (xRealIp == null || xRealIp.isEmpty()) ? "" : xRealIp.get(0));response.getHeaders().add("Remote-Host", (remoteHost == null || remoteHost.isEmpty()) ? "" :remoteHost.get(0));});//身份认证等等....return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

     通过上述设置以后,我们就能正常在request请求头中获取相关信息了。


http://www.ppmy.cn/devtools/16740.html

相关文章

K8S Service 常见问题

Service 问题排查 为了演示需要部署以下服务。 apiVersion: apps/v1 kind: Deployment metadata:name: busyboxnamespace: appslabels:app: busybox spec:replicas: 1selector:matchLabels:app: busyboxtemplate:metadata:labels:app: busyboxspec:containers:- name: busybo…

网络安全之弱口令与命令爆破(上篇)(技术进阶)

目录 一&#xff0c;什么是弱口令&#xff1f; 二&#xff0c;为什么会产生弱口令呢&#xff1f; 三&#xff0c;字典的生成 四&#xff0c;使用Burpsuite工具弱口令爆破 总结 一&#xff0c;什么是弱口令&#xff1f; 弱口令就是容易被人们所能猜到的密码呗&#xff0c;…

先进制造aps专题三 为什么java语言不适合作为aps算法的开发语言

为什么java语言不适合作为aps算法的开发语言 主要两个原因 1 java的list在特定位置插入&#xff0c;其实是重新生成一个新list,而不像c就是指针操作 2 数据量大&#xff0c;运行时间长&#xff0c;会跑崩 所以商业aps产品&#xff0c;都是清一色的用c写aps算法 先进制造…

centos7.9下安装SVN服务

一、安装subversion yum install -y subversion #安装svn mkdir -p /data/svnrepos/java #自定义svn仓库位置/data/svnrepos&#xff0c;自定义一个项目叫svn&#xff08;这里新建目录&#xff09; svnadmin create /data/svnrepos/java #创建一…

jenkins自动化举例

使用 Jenkins 可以显著提高工作效率&#xff1a; 1. **自动化构建**&#xff1a; - 假设您是一个开发人员&#xff0c;需要频繁地编译和测试代码。手动执行这些任务可能会非常耗时。使用 Jenkins&#xff0c;您可以设置自动化构建流程&#xff0c;每当您提交新代码时&#…

如何优雅的实现 iframe 多层级嵌套通讯

前言 在前端开发项目中&#xff0c;不可避免的总会和 iframe 进行打交道&#xff0c;我们通常会使用 postMessage 实现消息通讯。 如果存在下面情况&#xff1a; iframe 父子通讯iframe 同层级通讯iframe 嵌套层级通讯 当面对这种复杂的情况的时候&#xff0c;通讯不可避免…

超级详细的电脑通过网线连接树莓派操作步骤,以及无法查询到树莓派ip的解决办法(本人亲自踩坑无数总结而来,学不会来揍我系列)

一、正常操作流程 1.首先下载官方烧录系统软件。 Raspberry Pi OS – Raspberry Pi&#xff08;软件下载地址&#xff09; 选择Windows类型&#xff08;这里如果不是Windows用户的友友们可以不用看了&#xff0c;因为后面是基于Windows的远程操控来实现的&#xff0c;苹果的…

【Hadoop】-Apache Hive概述 Hive架构[11]

目录 Apache Hive概述 一、分布式SQL计算-Hive 二、为什么使用Hive Hive架构 一、Hive组件 Apache Hive概述 Apache Hive是一个在Hadoop上构建的数据仓库基础设施&#xff0c;它提供了一个SQL-Like查询语言来分析和查询大规模的数据集。Hive将结构化查询语言&#xff08;…